我正在进行以下案例研究。
我创建了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"/>
请告知上述所需的更正。
由于
答案 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
发起方。