DAML使用Java绑定流式传输所有活动合同-LedgerView

时间:2019-11-12 05:24:31

标签: java spring-boot daml

我是DAML的新手,我想使用Java绑定,Bot API查询所有有效合同,并将它们保存在DB(或内存中)中以备将来查询。

根据文档,LedgerView可以跟踪内存中的活动合同。但是,我无法成功传输活动合同。

您可以在这里找到我的代码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();
    }
}

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

  

contractCache是一个类,它使用CreatedContract对象并将其加载到缓存中。

我可能做的事情完全错了。请纠正我。

1 个答案:

答案 0 :(得分:1)

我放弃了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