我做了一个简单的DSL,该DSL从数据库中检索数据并在服务激活器中进行简单转换。
@Bean
public IntegrationFlow mainFlow() {
return IntegrationFlows.from("userChannel")
.channel("queryChannel")
.handle("sampleConvertor","convertUser")
.get();
QueryChannel是JDBC出站网关,SampleConverter是服务激活器。
<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"/>
请建议我在这里做错了什么。预先感谢。
组合Java DSL和XML配置有点不寻常,但是它们仍然可以一起工作。
您的问题我认为您缺少queryChannel
在运行时有两个订户的事实,而不是通话链。
第一个是<int-jdbc:outbound-gateway>
,第二个是.handle("sampleConvertor","convertUser")
。是的,当您在IntegrationFlow
中声明通道时,下一个EIP方法会为此通道产生A subscriber 。同时,当您在XML配置中使用request-channel
或input-channel
之类的通道也带来了订户。
因此,您的DirectChannel
上有两个订户,因此只有一个RoundRobinLoadBalancingStrategy
,因此只有一个会处理一条消息,如果它是请求重复组件,就像<int-jdbc:outbound-gateway>
一样,它将在output-channel
或replyChannel
中产生消息在标题中。在您的情况下,故事正是关于replyChannel
的,因此您不去.handle("sampleConvertor","convertUser")
,因为它不是链中的下一个,而只是圆形旋转算法的平行宇宙。
如果您确实想在拨打<int-jdbc:outbound-gateway>
之后到达.handle("sampleConvertor","convertUser")
,则应考虑使用.gateway("queryChannel")
而不是该.channel()
。