0

我有一个带有 JMS 请求-回复块的 Mule(3.5) 流。我看到所有进入回复队列的消息都会自动消耗。我想处理进入 jms 回复队列的消息。到目前为止,我已经尝试过 jms:selector 和 jms requester 模块,但没有运气。有什么办法可以做到这一点?

代码:

<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 的任何内容。有没有适当的方法来实现这一目标?

4

2 回答 2

1

<property key="selector" value="JMSCorrelationID='#[message.correlationId]'"/>首先在入站 JMS 端点中删除

然后尝试以下操作以基于入站 JMS 端点中的过滤器使用消息:-

<jms:inbound-endpoint queue="StudioOUT" connector-ref="Active_MQ1" exchange-pattern="one-way">
 <jms:selector expression="JMSCorrelationID= #[message.correlationId]" /> 

</jms:inbound-endpoint> 

如果您想将属性设置为消息并发送到出站 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 的队列。

现在您可以从 JMS 优先级为 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 出站端点向 JMS 队列发送少量消息..

于 2014-08-20T08:34:16.043 回答
0

将消息发送到 JMS 出站时,使用以下命令复制相关 ID

<jms:outbound-endpoint queue="StudioIN" connector-ref="Active_MQ1"  exchange-pattern="one-way">            
    <copy-properties propertyName="*"></copy-properties>
<jms:outbound-endpoint> 

希望这可以帮助。

于 2014-08-20T13:47:41.540 回答