我有一个带有JMS请求-应答块的Mule(3.5)流。我看到所有来回复队列的消息都会自动被消耗掉。我想处理到jms回复队列的消息。到目前为止,我已经尝试了jms:selector和jms请求者模块,但没有成功。有办法做到这一点吗?
代码:
<mule>
<flow name="main" doc:name="main">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" path="test" port="2000" doc:name="HTTP"/>
<logger message="starting main flow" level="INFO" doc:name="Logger"/>
<request-reply storePrefix="mainFlow">
<jms:outbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" exchange-pattern="one-way"/>
<jms:inbound-endpoint queue="StudioOUT" connector-ref="Active_MQ1" exchange-pattern="one-way">
<property key="selector" value="JMSCorrelationID='#[message.correlationId]'"/>
</jms:inbound-endpoint>
</request-reply>
</flow>
<flow name="worker" doc:name="worker">
<jms:inbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" doc:name="JMS"/>
<async doc:name="Async">
<logger message="starting worker task(s) .... Payload: #[payload], Request: #[message.inboundProperties['http.request']]" level="INFO" doc:name="Logger"/>
<scripting:component doc:name="thread-sleep(10s)">
<scripting:script engine="Groovy">
System.out.println "about to sleep @ time" + System.currentTimeMillis()
Thread.sleep(10000);
System.out.println "done sleeping @ time" + System.currentTimeMillis()
</scripting:script>
</scripting:component>
<logger message="finishing up worker task(s) ...." level="INFO" doc:name="Logger"/>
</async>
</flow>
</mule>我想处理回复队列StudioOUT所带来的任何问题。有什么合适的方法来实现这一点吗?
发布于 2014-08-20 08:34:16
首先在<property key="selector" value="JMSCorrelationID='#[message.correlationId]'"/>入站端点中删除
然后在入站JMS端点中尝试以下基于过滤器的消息:
<jms:inbound-endpoint queue="StudioOUT" connector-ref="Active_MQ1" exchange-pattern="one-way">
<jms:selector expression="JMSCorrelationID= #[message.correlationId]" />
</jms:inbound-endpoint> 如果要将属性设置为message并发送到出站JMS端点中的出站JMSQueue,请尝试以下操作:
<jms:outbound-endpoint queue="StudioOUT" connector-ref="Active_MQ" doc:name="JMS">
<jms:object-to-jmsmessage-transformer name="ObjectToJmsMessage" />
<message-properties-transformer>
<add-message-property key="CorrelationID" value="#[message.correlationId]"/>
</message-properties-transformer>
</jms:outbound-endpoint>更新流:-为特定类型选择一个JMS,我们需要首先在队列中设置它.例如,让我们假设我们只需要选择和使用那些优先级为7的JMS消息。现在让我们将消息发送到优先级为7的JMS队列中。
因此,在JMS出站端点中设置以下内容
<jms:outbound-endpoint queue="StudioOUT" connector-ref="Active_MQ" doc:name="JMS">
<jms:object-to-jmsmessage-transformer name="ObjectToJmsMessage" />
<message-properties-transformer>
<add-message-property key="Priority" value="7"/>
</message-properties-transformer>
</jms:outbound-endpoint>现在,这将发送消息到队列中,JMS优先级为7。
现在您可以从为7的队列中使用这些消息。重发消息将被忽略,不会被消耗。因此,现在在JMS入站端点中使用以下方法过滤消息:
<jms:inbound-endpoint queue="StudioOUT" connector-ref="Active_MQ1" exchange-pattern="one-way">
<jms:selector expression="JMSPriority = 7" />
</jms:inbound-endpoint> 这里将只使用优先级为7的消息。现在您可以将入站配置为从队列中选择特定类型的消息。但是要确保JMS中存在这种特定类型的消息(这里是带有priority=7的消息)。所以..。为此,您需要使用JMS出站端点向JMS队列发送少量消息,我现在向您展示了这一点。
发布于 2014-08-20 13:47:41
在将消息发送到JMS出站时,使用以下方法复制相关ID
<jms:outbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" exchange-pattern="one-way">
<copy-properties propertyName="*"></copy-properties>
<jms:outbound-endpoint> 希望这能有所帮助。
https://stackoverflow.com/questions/25394528
复制相似问题