从xml调用channel时Spring集成DSL ::面临的问题

时间:2018-02-08 21:36:34

标签: spring-integration spring-integration-dsl

我做了一个简单的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"/>

请在这里建议我做错了什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

将Java DSL和XML配置结合起来有点不寻常,但它们仍然可以协同工作。

您的问题我认为您错过了queryChannel在运行时有两个订阅者而不是一连串调用的事实。

第一个是<int-jdbc:outbound-gateway>,第二个是.handle("sampleConvertor","convertUser")。是的,当您在IntegrationFlow中声明频道时,下一个EIP方法会为此频道生成订阅者。同时,在XML配置中使用request-channelinput-channel等频道时,也会带来订阅者。

因此,您在DirectChannel上有RoundRobinLoadBalancingStrategy的两个订阅者,因此只有其中一个订阅者会处理一条消息,如果它是一个请求 - 重复组件,就像那个<int-jdbc:outbound-gateway>它会在标题中的output-channelreplyChannel中生成一条消息。在你的情况下,故事恰好是replyChannel,因此你不会去.handle("sampleConvertor","convertUser"),因为它不是链中的下一个,而是循环算法的平行宇宙。 / p>

如果您真的想在致电.handle("sampleConvertor","convertUser")后与<int-jdbc:outbound-gateway>联系,则应考虑使用.gateway("queryChannel")代替.channel()