1

以前のいくつかの議論を確認しましたが、答えが見つかりませんでした。

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>

"<jms:selector expression="MULE_CORRELATION_ID='12345'"/>" のような静的な値を試してみると、うまくいきます。しかし、MEL を使用して動的 ID を試してみると、うまくいきません。jms セレクター式内の MEL が機能していません。メッセージは未読のままキューに残ります。ログを使用して、mainFlow で設定されているときに MULE_CORRELATION_ID が何であるかを確認したところ、キューで未読のメッセージに同じ値が設定されていることがわかりました。したがって、MULE_CORRELATION_ID の設定方法に問題はないと思います。唯一の問題は、MEL が jms:selector 内で機能しないことです。

JMS セレクター内で MEL を機能させる方法を教えてください。

どうもありがとうございました。

4

2 に答える 2

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 を使用して、メッセージを要求キューから応答キューに手動で移動したことに注意してください。リアルタイムでは、別のプログラムによって実行されます。

于 2015-10-21T18:06:05.587 に答える