gpt4 book ai didi

java - DAML 使用 Java 绑定(bind)流式传输所有 Activity 合约 - LedgerView

转载 作者:行者123 更新时间:2023-12-02 09:19:03 27 4
gpt4 key购买 nike

我是 DAML 新手,我想使用 Java 绑定(bind)、Bot API 查询所有 Activity 合约,并将它们保存到数据库(或内存中)以供将来查询。

根据文档,LedgerView 可以跟踪内存中的 Activity 合约。但是我无法成功传输 Activity 契约(Contract)。

您可以在这里找到我的代码,https://github.com/agrawald/daml-java-bot 。上面的代码有一个我不太引以为豪的计划任务。

我在其中创建 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();
}
}

我相信我应该在 (ledgerView) -> Flowable.empty() 运行一些Command

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 .

关于java - DAML 使用 Java 绑定(bind)流式传输所有 Activity 合约 - LedgerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58812526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com