我正在使用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,但注意到了。
有什么想法吗?
干杯。
答案 0 :(得分:2)
不确定为什么每个人都认为必须仅将流声明为单个IntegrationFlow
对象,但没有人阻止您将其划分为多个并与频道连接。一个人可以用.channel("foo")
结束,另一个人可以从IntegraitonFlows.from("foo")
开始。虽然看起来你可以省略该通道并将两个流连接成一个。
IntegrationFlow
只是让你最小化代码数量,并且真的省略了一些样板片段。但是如果你的逻辑需要通道,或者有几个阶段,那么划分并享受结果就可以了。
所以,你的逻辑就像:
IntegrationFlow
dbDataMessageSource()
轮询数据库并进行处理。另一个独立的流程。请阅读有关Core Spring Integration的更多信息。 Java DSL只是试图简化配置,但它仍遵循SI Core中相同的channel -> endpoint -> handler
原则。
答案 1 :(得分:0)
好吧,我找到了一种方法,就像我提到的那样。我可以重写JdbcOutboundGateway,包括JdbcMessageHandler和JdbcPollingChannelAdapter,并使最后一个可配置,以便我可以按照我想要的方式设置轮询时间和输出通道。
有点狡猾,但应该有效。
干杯。