我做了一个简单的DSL,它从数据库中检索数据并在服务激活器中进行简单的转换。
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from("userChannel")
.channel("queryChannel")
.handle("sampleConvertor","convertUser")
.get();
queryChannel是一个jdbc出站网关,sampleConverter是服务Activator。
<int-jdbc:outbound-gateway query="select * from employee where employee_id=:payload"
request-channel="queryChannel" data-source="dataSource"/>
问题是从数据库中检索数据后,流程不会转到serviceActivator,而只是返回数据库响应。
在xml配置中,我曾经在链中调用网关,如下所示。
<int:gateway id="query.gateway" request-channel="queryChannel"/>
请在这里建议我做错了什么。提前谢谢。
答案 0 :(得分:1)
将Java DSL和XML配置结合起来有点不寻常,但它们仍然可以协同工作。
您的问题我认为您错过了queryChannel
在运行时有两个订阅者而不是一连串调用的事实。
第一个是<int-jdbc:outbound-gateway>
,第二个是.handle("sampleConvertor","convertUser")
。是的,当您在IntegrationFlow
中声明频道时,下一个EIP方法会为此频道生成订阅者。同时,在XML配置中使用request-channel
或input-channel
等频道时,也会带来订阅者。
因此,您在DirectChannel
上有RoundRobinLoadBalancingStrategy
的两个订阅者,因此只有其中一个订阅者会处理一条消息,如果它是一个请求 - 重复组件,就像那个<int-jdbc:outbound-gateway>
它会在标题中的output-channel
或replyChannel
中生成一条消息。在你的情况下,故事恰好是replyChannel
,因此你不会去.handle("sampleConvertor","convertUser")
,因为它不是链中的下一个,而是循环算法的平行宇宙。 / p>
如果您真的想在致电.handle("sampleConvertor","convertUser")
后与<int-jdbc:outbound-gateway>
联系,则应考虑使用.gateway("queryChannel")
代替.channel()
。