2015-10-13 5 views
1

Я проверил несколько предыдущих обсуждений, но не смог найти ответ.Как использовать выражение Mule в JMS: selector

Я пытаюсь добиться синхронного общения с использованием обратного канала JMS (http://www.whishworks.com/blog/synchronous-communication-using-jms-back-channel). Помимо вещей, упомянутых на этом сайте, мне нужно отфильтровать сообщение из входящей очереди на основе динамического идентификатора.

После мой мул потоки:

<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: выражение селектор =" MULE_CORRELATION_ID = "12345 "/ >", это работает. Но если я попробую динамический идентификатор с помощью MEL, он не работает. MEL внутри выражения селектора jms не работает. Сообщение остается в очереди как «Непрочитано». Я использовал журналы, чтобы узнать, что MULE_CORRELATION_ID установлен в mainFlow, и обнаружил, что одно и то же значение установлено в сообщении, которое является UNREAD в очереди. Итак, я думаю, что нет ничего плохого в том, как установлен MULE_CORRELATION_ID. Единственная проблема заключается в том, что MEL не работает в jms: selector.

Не могли бы вы помочь, как заставить MEL работать в селекторе JMS?

спасибо.

+0

Я могу реплицировать проблему с предоставленным XML. Кажется, это ошибка, так как мы можем печатать значения в регистраторах и не работать только в JMS-селекторе (где он работает со статическим значением, как вы сказали). Я попытался с помощью , но не повезло. – RamakrishnaN

ответ

3

MEL отлично работает в селекторе, но его использование очень ограничено. Когда создается JMS-селектор, для Mule нет события в полете, поэтому нет доступных данных, связанных с событиями (включая сеанс).

Чтобы выбрать очень конкретное сообщение, вам нужно использовать JMS message requester, построенный с требуемым селектору, например:

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

Большое спасибо Дэвиду. Оно работает. Я столкнулся с другой проблемой, когда у меня есть несколько коннекторов. Я опубликовал для этого новый вопрос: http://stackoverflow.com/questions/33266088/using-mulerequester-when-there-are-more-than-one-jms-or-wmq-connector – Joe

1

Вот рабочее решение, основанное на предложении Дэвида. Я использую 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 для моего тестирования. В реальном времени это будет сделано другой программой.

Смежные вопросы