MessageSource作为流程步骤

时间:2016-06-01 13:47:59

标签: spring-integration spring-dsl

我正在使用SI-DSL编写SI流程,所以我首先要说的是,我不知道这个问题是仅与Si-DSL有关还是与SI和SI-DSL都有关。 / p>

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

我的问题是第3步。如果第3步是第1步将很容易,因为我可以使用JdbcPollingChannelAdapteras一个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)))

而不是" .handle"我尝试使用gateway,bridge,handleWithAdapter,但注意到了。

有什么想法吗?

干杯。

2 个答案:

答案 0 :(得分:2)

不确定为什么每个人都认为必须仅将流声明为单个IntegrationFlow对象,但没有人阻止您将其划分为多个并与频道连接。一个人可以用.channel("foo")结束,另一个人可以从IntegraitonFlows.from("foo")开始。虽然看起来你可以省略该通道并将两个流连接成一个。

IntegrationFlow只是让你最小化代码数量,并且真的省略了一些样板片段。但是如果你的逻辑需要通道,或者有几个阶段,那么划分并享受结果就可以了。

所以,你的逻辑就像:

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

请阅读有关Core Spring Integration的更多信息。 Java DSL只是试图简化配置,但它仍遵循SI Core中相同的channel -> endpoint -> handler原则。

答案 1 :(得分:0)

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

有点狡猾,但应该有效。

干杯。