1

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

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

4

1 回答 1

1

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

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

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

DirectChannel因此,您在 the上有两个订阅者RoundRobinLoadBalancingStrategy,因此其中只有一个会处理消息,如果它是请求-回复组件,<int-jdbc:outbound-gateway>那么它将在 header 中生成一条消息到 theoutput-channel或 thereplyChannel中。在您的情况下,故事完全是关于 a 的replyChannel,因此您不会去,.handle("sampleConvertor","convertUser")因为它不是链中的下一个,而只是循环算法的平行宇宙。

如果你真的想.handle("sampleConvertor","convertUser")在调用 之后达到那个<int-jdbc:outbound-gateway>,你应该考虑使用.gateway("queryChannel")而不是那个.channel()

于 2018-02-09T15:58:18.003 回答