在Spring Integration中使用QueueChannel

时间:2017-06-27 21:22:27

标签: spring-integration

我正在进行以下案例研究。

  1. 创建一个Rest服务以接受引用ID。
  2. 使用参考ID从数据库获取数据(CLOB)。
  3. 将数据(CLOB)放入通道(队列)中进行进一步处理。
  4. 使用JSON格式的回复数据回复其余客户端{“status”:true,“message”:“RECEIVED”}
  5. 我创建了Rest Service并使用Ref Id从数据库获取数据但是在将消息放入通道(队列)后,我无法将响应发送回其他客户端。 Rest Client收到的输出是:超时内未收到回复

    基本上我希望在将数据(CLOB)推送到通道(队列)后立即返回请求线程。

    以下是配置。

    <int:channel id="responseChannel"/>
    <int:channel id="initCalculation">
       <int:queue/>
    </int:channel>
    
    
    <!-- GET -->
    <int-http:inbound-gateway 
        request-channel="httpGetChannel"
        reply-channel="responseChannel"
        supported-methods="GET"
        path="/init/{refId}"
        payload-expression="#pathVariables.refId">
    
        <int-http:request-mapping  produces="application/json"/>
    
    </int-http:inbound-gateway>
    
    
    <int:chain input-channel="httpGetChannel" output-channel="initCalculation">
        <int-jdbc:stored-proc-outbound-gateway
                id="outbound-gateway-storedproc-get-forma" data-source="dataSource"
                is-function="false"
                stored-procedure-name="XX_EMPROC.GET_FRMA"
                ignore-column-meta-data="true"
                expect-single-result="true">
    
            <int-jdbc:sql-parameter-definition name="V_REF_ID" direction="IN" />
            <int-jdbc:sql-parameter-definition name="V_FRMA"   direction="OUT" type="#{T(oracle.jdbc.OracleTypes).CLOB}"/>
    
            <int-jdbc:parameter name="V_REF_ID" expression="payload" />
        </int-jdbc:stored-proc-outbound-gateway>
    
        <!- Convert to JSON Format -->
        <int:service-activator ref="brInitGateway" method="getResponse"/>
    
    </int:chain>
    
    
    <int:outbound-channel-adapter channel="initCalculation"  ref="brInitGateway"   method="process"/>
    

    请告知上述所需的更正。

    由于

1 个答案:

答案 0 :(得分:2)

看,没有正文发送消息作为对<int-http:inbound-gateway>的回复。您已声明responseChannel,但是谁将其用作output-channel

我建议你这样做:

<publish-subscribe-channel id="responseChannel"/>

<int:chain input-channel="httpGetChannel" output-channel="responseChannel">


 <int:bridge input-channel="responseChannel" output-channel="initCalculation"/>

那么,这里会发生什么:

publish-subscribe-channel的{​​{1}}作为订阅者之一与reply-channel标头形成内部桥接。

您将replyChannel的结果发送到该频道。因此<chain>得到了回复。

<int-http:inbound-gateway>的{​​{1}}回复<int:bridge>您有第二个订阅者,因此,将消息发送到所需的队列。

如果您对initCalculation对HTTP请求的回复不感兴趣,您应该考虑根本没有brInitGateway.getResponse(),但仍然使用一些reply-channel="responseChannel"发送给队列和一些变换器准备回复,例如:

<publish-subscribe-channel>

此变换器没有<transformer input-channel="prepareProcess" expression="' {"status": true,"message": "RECEIVED"}'"/> ,因为它会将结果发送到output-channel标头,因此发送到replyChannel发起方。