我有一个带有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的任何内容。有没有正确的方法来实现这个目标?
答案 0 :(得分:1)
首先删除入站JMS端点
中的<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端点中的Outbound 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消息。现在让我们将消息发送到JMS队列,优先级为7 ..
因此,在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>
现在,这将向Queue发送消息,JMS优先级为7 ..
现在您可以从JMS proirity为7的队列中使用这些消息。将忽略重新发送的消息,并且不会消耗它。 因此,现在在JMS入站端点中使用以下内容来过滤消息: -
<jms:inbound-endpoint queue="StudioOUT" connector-ref="Active_MQ1" exchange-pattern="one-way">
<jms:selector expression="JMSPriority = 7" />
</jms:inbound-endpoint>
此处仅消耗优先级为7的消息。现在,您可以配置入站以从队列中选择特定类型的消息..但请确保该特定类型的消息(此处优先级为7的消息) )存在于JMS队列中..所以..为此目的,您需要使用我现在向您展示的JMS Outbound端点向JMS队列发送一些消息..
答案 1 :(得分:0)
将消息发送到JMS出站
时,使用以下内容复制关联ID<jms:outbound-endpoint queue="StudioIN" connector-ref="Active_MQ1" exchange-pattern="one-way">
<copy-properties propertyName="*"></copy-properties>
<jms:outbound-endpoint>
希望这会有所帮助。