1

我正在使用 SI-DSL 编写一个 SI 流程,所以让我先说我不知道​​这个问题是仅与 Si-DSL 相关还是与 SI 和 SI-DSL 相关。

我的用例是这样
的 - 从队列中获取消息 - 将消息保存在数据库表中 - 通过在未来某个时间点选择处于某个特定状态的消息来检索这些消息 - 进一步处理消息......

我的问题是第三步。如果第 3 步是第 1 步,这将很容易,因为我可以只使用 JdbcPollingChannelAdaptera 作为 MessageSource。但是,我找不到在流程中间使用的方法。所以,在 DSL 术语中,我可以做到(其中 dbDataMessageSource 是 JdbcPollingChannelAdapter)

IntegrationFlows
    .from(dbDataMessageSource(), p -> p.poller(Pollers.fixedRate(24, TimeUnit.HOURS)))

但我做不到

IntegrationFlows
            .from(Jms.messageDrivenChannelAdapter(...))
            .handle(new JdbcOutboundGateway(...)
            .handle(dbDataMessageSource(), p -> p.poller(Pollers.fixedRate(24, TimeUnit.HOURS)))

我尝试使用网关、网桥、handleWithAdapter 而不是“.handle”,但注意到有效。

有任何想法吗?

干杯。

4

2 回答 2

2

不知道为什么每个人都认为必须将流声明为单个IntegrationFlow对象,但是没有人阻止您将其分成几个并与通道连接。一个可以结束.channel("foo"),另一个可以开始IntegraitonFlows.from("foo")。尽管看起来您可以省略该通道并将两个流连接为一个。

IntegrationFlow只是让您最大限度地减少代码数量并真正省略一些样板代码片段。但是如果你的逻辑需要通道,或者有几个阶段,那么划分并享受结果是可以的。

所以,你的逻辑是这样的:

  • 从队列中读取并存储在数据库中。这是一个IntegrationFlow
  • dbDataMessageSource()使用和处理轮询数据库。另一个独立的流程。

请阅读有关核心 Spring 集成的更多信息。Java DSL 只是试图简化配置,但它仍然遵循与channel -> endpoint -> handlerSI Core 相同的原则。

于 2016-06-01T15:38:54.693 回答
0

好吧,我找到了一种方法来做到这一点,就像我提到的那样。我可以重写 JdbcOutboundGateway,它包括一个 JdbcMessageHandler 和一个 JdbcPollingChannelAdapter,并使最后一个可配置,这样我就可以按照我想要的方式设置轮询时间和输出通道。

有点狡猾,但它应该工作。

干杯。

于 2016-06-01T16:23:43.737 回答