DAML 使用 Java 绑定流式传输所有活动合约 - LedgerView
DAML Stream all the active contracts using Java Binding - LedgerView
我是 DAML 的新手,我想使用 Java 绑定、Bot API 查询所有活动合约,并将它们保存到数据库(或内存中)以供将来查询。
根据文档,LedgerView 可以跟踪内存中的活动合约。但是我无法成功地传输有效合同。
你可以在这里找到我的代码,https://github.com/agrawald/daml-java-bot。
上面的代码有一个我不太自豪的计划任务。
class 的代码,我在其中创建 DamlLedgerClient
并启动计划作业以触发 Bot
。请注意
@Slf4j
@Service
@RequiredArgsConstructor
public class DamlContractSvc implements InitializingBean {
@Value("${daml.host}")
private String host;
@Value("${daml.port}")
private int port;
@Value("${daml.appId}")
private String appId;
@Value("${daml.party}")
private String party;
@Value("${daml.packageId}")
private String packageId;
@Autowired(required = true)
private ContractCache contractCache;
private DamlLedgerClient client;
@Scheduled(fixedDelay = 5000)
public void fetch() {
final TransactionFilter transactionFilter = new FiltersByParty(
Collections.singletonMap(party, NoFilter.instance));
Bot.wire(appId, client, transactionFilter, (ledgerView) -> Flowable.empty(),
contractCache);
}
@Override
public void afterPropertiesSet() throws Exception {
client = DamlLedgerClient.forHostWithLedgerIdDiscovery(host, port, Optional.empty());
client.connect();
}
}
我相信我应该 运行 一些 Command
在 (ledgerView) -> Flowable.empty()
。
contractCache
is a class which takes CreatedContract
object and load it in the cache.
我可能做错了什么。请指正。
我放弃了 Bot
方法并开始使用 TransactionClient
参考 Bot.wire
方法的实现方式。以下是我的实现方式
@Slf4j
@Service
@RequiredArgsConstructor
public class DamlContractSvc implements InitializingBean {
@Value("${daml.host}")
private String host;
@Value("${daml.port}")
private int port;
@Value("${daml.appId}")
private String appId;
@Value("${daml.party}")
private String party;
@Value("${daml.packageId}")
private String packageId;
@Autowired(required = true)
private ContractRepo contractRepo;
private DamlLedgerClient client;
private final static AtomicReference<LedgerOffset> OFFSET = new AtomicReference<>(
LedgerOffset.LedgerBegin.getInstance());
@Scheduled(fixedDelay = 5000)
public void fetch() {
final TransactionFilter transactionFilter = new FiltersByParty(
Collections.singletonMap(party, NoFilter.instance));
client.getTransactionsClient().getTransactions(OFFSET.get(), transactionFilter, true).flatMapIterable(t -> {
OFFSET.set(new LedgerOffset.Absolute(t.getOffset()));
return t.getEvents();
}).forEach(contractRepo);
}
@Override
public void afterPropertiesSet() throws Exception {
client = DamlLedgerClient.forHostWithLedgerIdDiscovery(host, port, Optional.empty());
client.connect();
}
}
我正在跟踪 OFFSET
并获取从 LedgerOffset.LedgerBegin 开始的所有内容。
完整的代码库在这里:https://github.com/agrawald/daml-java-bot。
我是 DAML 的新手,我想使用 Java 绑定、Bot API 查询所有活动合约,并将它们保存到数据库(或内存中)以供将来查询。
根据文档,LedgerView 可以跟踪内存中的活动合约。但是我无法成功地传输有效合同。
你可以在这里找到我的代码,https://github.com/agrawald/daml-java-bot。 上面的代码有一个我不太自豪的计划任务。
class 的代码,我在其中创建 DamlLedgerClient
并启动计划作业以触发 Bot
。请注意
@Slf4j
@Service
@RequiredArgsConstructor
public class DamlContractSvc implements InitializingBean {
@Value("${daml.host}")
private String host;
@Value("${daml.port}")
private int port;
@Value("${daml.appId}")
private String appId;
@Value("${daml.party}")
private String party;
@Value("${daml.packageId}")
private String packageId;
@Autowired(required = true)
private ContractCache contractCache;
private DamlLedgerClient client;
@Scheduled(fixedDelay = 5000)
public void fetch() {
final TransactionFilter transactionFilter = new FiltersByParty(
Collections.singletonMap(party, NoFilter.instance));
Bot.wire(appId, client, transactionFilter, (ledgerView) -> Flowable.empty(),
contractCache);
}
@Override
public void afterPropertiesSet() throws Exception {
client = DamlLedgerClient.forHostWithLedgerIdDiscovery(host, port, Optional.empty());
client.connect();
}
}
我相信我应该 运行 一些 Command
在 (ledgerView) -> Flowable.empty()
。
contractCache
is a class which takesCreatedContract
object and load it in the cache.
我可能做错了什么。请指正。
我放弃了 Bot
方法并开始使用 TransactionClient
参考 Bot.wire
方法的实现方式。以下是我的实现方式
@Slf4j
@Service
@RequiredArgsConstructor
public class DamlContractSvc implements InitializingBean {
@Value("${daml.host}")
private String host;
@Value("${daml.port}")
private int port;
@Value("${daml.appId}")
private String appId;
@Value("${daml.party}")
private String party;
@Value("${daml.packageId}")
private String packageId;
@Autowired(required = true)
private ContractRepo contractRepo;
private DamlLedgerClient client;
private final static AtomicReference<LedgerOffset> OFFSET = new AtomicReference<>(
LedgerOffset.LedgerBegin.getInstance());
@Scheduled(fixedDelay = 5000)
public void fetch() {
final TransactionFilter transactionFilter = new FiltersByParty(
Collections.singletonMap(party, NoFilter.instance));
client.getTransactionsClient().getTransactions(OFFSET.get(), transactionFilter, true).flatMapIterable(t -> {
OFFSET.set(new LedgerOffset.Absolute(t.getOffset()));
return t.getEvents();
}).forEach(contractRepo);
}
@Override
public void afterPropertiesSet() throws Exception {
client = DamlLedgerClient.forHostWithLedgerIdDiscovery(host, port, Optional.empty());
client.connect();
}
}
我正在跟踪 OFFSET
并获取从 LedgerOffset.LedgerBegin 开始的所有内容。
完整的代码库在这里:https://github.com/agrawald/daml-java-bot。