如何在JMS中使用Mule Expression:selector

时间:2015-10-13 14:56:24

标签: mule mule-component mule-el anypoint-studio

我检查过几个先前的讨论,但无法找到答案。

我正在尝试使用JMS反向通道(http://www.whishworks.com/blog/synchronous-communication-using-jms-back-channel)实现同步通信。除了该站点中提到的内容之外,我还需要根据动态Id过滤掉入站队列中的消息。

以下是我的骡子流:

<flow name="serverFlow" >
    <jms:inbound-endpoint doc:name="REQUEST" queue="REQUEST.QUEUE" connector-ref="jmsConnector">
            <jms:selector expression="MULE_CORRELATION_ID='#[sessionVars.myCorrelationId]'"/>
    </jms:inbound-endpoint>     

    <set-payload value="#[payload] + Hello World from Receiver" doc:name="Set Payload" />

    <jms:outbound-endpoint doc:name="REPLY" queue="REPLY.QUEUE" connector-ref="jmsConnector" />
</flow>

 <flow name="mainFlow" >
    <http:listener config-ref="HTTP_Listener_Configuration" path="/jms" allowedMethods="GET" doc:name="HTTP"/>
    <set-session-variable variableName="myCorrelationId" value="#[System.currentTimeMillis().toString()]" doc:name="Set Correlation ID"/>       
   <set-payload value="New message sent from Mule - mainFlow at #[new Date()]" doc:name="Set Message"/>        
   <set-property propertyName="MULE_CORRELATION_ID" value="#[sessionVars.myCorrelationId]" doc:name="Property"/>  
    <request-reply doc:name="Request-Reply">
        <jms:outbound-endpoint doc:name="REQUEST" connector-ref="jmsConnector" queue="REQUEST.QUEUE"/>
        <jms:inbound-endpoint doc:name="REPLY" connector-ref="jmsConnector" queue="REPLY.QUEUE"/>
    </request-reply>        
    <logger message="Reply to sender: #[message]" level="WARN" doc:name="Logger" />
</flow>

如果我尝试静态值,例如&#34;&lt; jms:selector expression =&#34; MULE_CORRELATION_ID =&#39; 12345&#39;&#34; /&gt;&#34;,它可以正常工作。但是,如果我使用MEL尝试动态ID,它就无法正常工作。 jms选择器表达式中的MEL不起作用。消息在队列中保持未读状态。我使用日志来查看在mainFlow中设置的MULE_CORRELATION_ID是什么,并且发现在队列中的UNREAD消息中设置了相同的值。所以,我想MULE_CORRELATION_ID的设置方式没有错。唯一的问题是MEL不能在jms:selector中工作。

请帮助您如何在JMS选择器中使用MEL?

非常感谢。

2 个答案:

答案 0 :(得分:3)

MEL在选择器中工作正常,但其使用非常有限。创建JMS选择器时,Mule没有可用的空中事件,因此没有任何事件绑定数据(包括会话)可用。

要选择一个非常特殊的消息,您需要使用由所需选择器构造的JMS message requester,如:

jms://REQUEST.QUEUE?selector=MULE_CORRELATION_ID%3D'#[sessionVars.myCorrelationId]'

答案 1 :(得分:1)

以下是基于David的建议的工作解决方案。我在这里使用wmq(不是jms)。

<mulerequester:config name="Mule_Requester" doc:name="Mule Requester"/>

<flow name="mainFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/test" allowedMethods="GET" doc:name="HTTP"/>        
    <set-payload value="My Message" doc:name="Set Message"/>  
    <set-property propertyName="JMSCorrelationID" value="12345" doc:name="Property"/>
    <set-session-variable variableName="myCorrelationId" value="ID:313233343500000000000000000000000000000000000000" doc:name="Set Correlation ID"/>
    <!--313233343500000000000000000000000000000000000000 is the MQMD CorrelationId for 12345. This is set by IBM MQ   -->
    <logger message="The Message to REQUEST QUEUE: #[message]" level="WARN" doc:name="Logger"/>        
    <wmq:outbound-endpoint  queue="REQUEST.QUEUE" connector-ref="wmqConnector" doc:name="OUT"/>
    <mulerequester:request config-ref="Mule_Requester" resource="wmq://REPLY.QUEUE?selector=JMSCorrelationID%3D'#[sessionVars.myCorrelationId]'" doc:name="Mule Requester" timeout="120000"/>   
    <logger message="Final Response: #[message]" level="WARN" doc:name="Logger"/>         
</flow> 

请注意,我使用MQVE手动将消息从Request队列移动到Reply队列进行测试。实时,它将由另一个程序完成。