【发布时间】:2015-04-27 01:57:11
【问题描述】:
<jms:activemq-connector name="jms-connector" brokerURL="${BrokerURL}" disableTemporaryReplyToDestinations="true" maxRedelivery="10" durable="true" specification="1.1"/>
<jms:endpoint connector-ref="jms-connector" name="SyncRequestsQueue" queue="SyncRequestsQueue">
<jms:transaction action="ALWAYS_BEGIN"/>
</jms:endpoint>
<flow name = "RequestsEntryFlow" >
<http:listener allowedMethods="POST" parseRequest="false" config-ref="HTTP_Request_Listener" path="/{name}" doc:name="HTTP Entry Flow" />
<flow-ref name="requestBeanCreate" />
<jms:outbound-endpoint connector-ref="jms-connector" exchange-pattern="request-response" ref="SyncRequestsQueue" />
</flow>
<flow name = "SyncRequestsQueueConsumer">
<jms:inbound-endpoint connector-ref="jms-connector" exchange-pattern="request-response" ref="SyncRequestsQueue" />
<set-variable variableName="id" value="#[payload]" doc:name="Variable" />
<set-variable variableName="destination" value="#[app.registry.routerBean.getDestination(app.registry.messageBean.getReceiverID(payload))]" doc:name="Variable" />
<set-payload value="#[app.registry.messageBean.sendRequestToDestination(payload)]" />
<processor-chain>
<http:outbound-endpoint address="http://#[flowVars.destination]" exchange-pattern="request-response">
<transformer ref="contentTypeTextXML"/>
</http:outbound-endpoint>
<expression-component>
app.registry.messageBean.sendResponseToSender(flowVars.id);
app.registry.messageBean.messageProcessedSuccessfully(flowVars.id);
</expression-component>
</processor-chain>
</flow>
这是场景:
对远程服务的请求进入 RequestsEntryFlow。 我用它做一些日志记录并将其发送到 SyncRequestsQueue。 SyncRequestsQueueConsumer 使用队列并将内容发送到远程服务器。 现在我想将远程服务器的响应返回到 RequestsEntryFlow 并从那里返回到服务调用者。 但响应没有返回给服务调用者。
注意:当我从代码中删除 JMS 和 Activemq 并使用 SyncRequestsQueueConsumer 作为子流程时,一切正常。所以我猜 JMS 连接器没有按照我需要的方式工作。
代码有什么问题,我该如何解决?谢谢你
--编辑--
我已经更改了我的代码以采用范围,现在它看起来像这样:
<flow name = "RequestsEntryFlow" >
<http:listener allowedMethods="POST" parseRequest="false" config-ref="HTTP_Request_Listener" path="/{name}" doc:name="HTTP Entry Flow" />
<flow-ref name="requestBeanCreate" />
<choice doc:name="Choice">
<when expression="#[app.registry.messageBean.isEMCRequired(payload)]">
<jms:outbound-endpoint connector-ref="jms-connector" ref="EMCRequiredRequestsQueue" />
</when>
<otherwise>
<request-reply>
<jms:outbound-endpoint connector-ref="jms-connector" exchange-pattern="one-way" ref="SyncRequestsQueue" />
<jms:inbound-endpoint connector-ref="jms-connector" exchange-pattern="one-way" queue="ResponseTempQueue" >
<set-payload value="#[payload.get(0)]"/>
<remove-property propertyName="Content_Type"/>
<transformer ref="contentTypeTextXML"/>
</jms:inbound-endpoint>
</request-reply>
</otherwise>
</choice>
</flow>
<flow name = "SyncRequestsQueueConsumer">
<jms:inbound-endpoint connector-ref="jms-connector" exchange-pattern="request-response" ref="SyncRequestsQueue" />
<set-variable variableName="id" value="#[payload]" doc:name="Variable" />
<set-variable variableName="destination" value="#[app.registry.routerBean.getDestination(app.registry.messageBean.getReceiverID(payload))]" doc:name="Variable" />
<set-payload value="#[app.registry.messageBean.sendRequestToDestination(payload)]" />
<http:outbound-endpoint address="http://#[flowVars.destination]" exchange-pattern="request-response">
<transformer ref="contentTypeTextXML"/>
</http:outbound-endpoint>
<expression-component>
app.registry.messageBean.sendResponseToSender(flowVars.id);
app.registry.messageBean.messageProcessedSuccessfully(flowVars.id);
</expression-component>
</flow>
如果我将电子记录器添加到我的代码中,它将打印正确的有效负载(来自服务器的响应)
<jms:inbound-endpoint connector-ref="jms-connector" exchange-pattern="one-way" queue="ResponseTempQueue" >
<set-payload value="#[payload.get(0)]"/>
<remove-property propertyName="Content_Type"/>
<transformer ref="contentTypeTextXML"/>
<logger level="INFO" message="#[payload]" />
</jms:inbound-endpoint>
但是响应没有通过 HTTP 路由回发送者
【问题讨论】: