使用出站通道适配器生成回复

时间:2015-06-26 06:33:12

标签: spring spring-integration

我有以下简化的spring集成流程:

int-ws:inbound-gateway ----> int:transformer ----> int-kafka:outbound-channel-adapter

基本上:

  1. 使用int-ws:inbound-gateway
  2. 公开Web服务端点
  3. 来自此终端的邮件会被放到input频道(第一个--->
  4. 自定义转换器转换有效负载JSON格式并添加MESSAGE_KEY标头(kafka所需)
  5. 邮件被放置在inputToKafka频道(第二个--->
  6. int-kafka:outbound-channel-adapter将邮件推送到kafka主题
  7. Web服务操作具有请求和响应有效负载 请求有效负载是我正在转换为JSON消息的 我希望在int-kafka:outbound-channel-adapter

    将消息放入kafka主题后返回响应有效负载(将进行编组等)

    我该怎么做?

    目前,当我调用Web服务时,一切都按预期工作,但我必须在reply-timeout上设置int-ws:inbound-gateway,以便它不会挂起。当我这样做时,我只是在SOAPUI上得到一个空响应。

    我理解Gateway behavior when no response arrives部分中的概念 - 但在我的情况下,我确实想要生成回复

    这是我的集成上下文(没有kafka代理配置等):

    <int-ws:inbound-gateway id="ws-inbound-gateway" request-channel="input"
                            marshaller="marshaller" unmarshaller="marshaller" reply-timeout="100"/>
    
    <int:channel id="input"/>
    
    <int:transformer input-channel="input" output-channel="inputToKafka" method="transform">
        <bean class="com.test.InputToJSONTransformer"/>
    </int:transformer>
    
    <int:channel id="inputToKafka"/>
    
    <int-kafka:outbound-channel-adapter kafka-producer-context-ref="kafkaProducerContext"
                                        auto-startup="true"
                                        channel="inputToKafka"
                                        order="1">
    </int-kafka:outbound-channel-adapter>
    

2 个答案:

答案 0 :(得分:2)

更改

<int:channel id="inputToKafka"/>

<int:publish-subscribe-channel id="inputToKafka"/>

向频道添加第二个订阅者。

<service-activator input-channel="inputToKafka" ... order="2" />

服务生成响应的位置;成功发送到kafka后会调用它。

不要包含output-channel;该框架将负责将服务输出路由回ws网关。

答案 1 :(得分:1)

您期望从Kafka出站渠道适配器获得什么样的响应,请记住它是Adapter而不是Gateway

然而,您可以引入另一个组件ServiceActivator现在您的变换器会输出到此频道,输入频道为sendToInputToKafka

您的&#39; ServiceActivator&#39;应该有@Autowire MessageChannel inputToKafka并且应该以编程方式手动向此频道发送消息。 发送该消息后,您将构建所需的响应作为ServiceActivator的返回类型和对ws gateway的回复