Contact Free trial Login

Listening For New Messages

The Listener source in the IBM MQ and its use of the JMS connector provides the ability to consume messages as they arrive at the destination.

Listening for New Messages

The syntax to listen for new messages from a queue is:

<ibm-mq:listener config-ref="config" destination="#[vars.destination]"/>

The source listens for new messages in the queue identified by the destination, returning a Mule Message each time a JMS message is available in the queue.

The message contains:

  • The message’s content as a payload.

  • The message’s metadata in the message attributes.

By default, the message consumed is acknowledged only when the execution of the flow receiving the message completes successfully. If instead, an error occurs during the execution of the flow, the session is recovered, and the JMS message is redelivered.

For more information regarding a message ACK, see Handling Message Acknowledgement.

Configuring Message Throughput

When extra processing power is needed, the JMS Listener allows you to configure the numberOfConsumers that a given Listener uses to consume messages concurrently. By default, each Listener uses four consumers to produce messages concurrently. Since each consumer waits for the message to be processed, that means that you can have a maximum of four messages in-flight at the same time. If you need to increase the concurrent message processing, just increase the numberOfConsumers in the Listener.

Filtering Incoming Messages

The JMS connector provides full support for filtering which Messages should be consumed based on the standard JMS selector language.

For example, if you have a priority Queue with Messages that need to be processed faster than the others, we can do:

<flow name="consumer">
    <ibm-mq:listener config-ref="JMS_config"
    destination="openTickets"
    selector="JMSPriority=8"/>
</flow>

When a selector is configured, only the messages matching it are received, ignoring any other message in the destination.

MIME Types and Encoding

The JMS connector does its best to automatically determine a message’s MIME type (contentType) based on the MM_MESSAGE_CONTENT_TYPE property. However, there are cases in which that best guess is not enough, and you need first-hand knowledge of the message’s content. In such cases, you can force the content type to a particular value by using the inboundContentType parameter.

The same process works for encoding. By default, the connector assumes that the runtime’s default encoding matches the one in the message if no other information is provided. You can set this by using the inboundEncoding parameter.

Replying to Incoming Messages

When an incoming JMS message declares a REPLY_TO destination, the JMS Listener automatically produces a response when the message is processed successfully, meaning that no error occurs during the flow execution. In this case, when the flow completes, a response is published to the destination specified in the processed message header.

Responses can be configured in the Listener with the following syntax:

<ibm-mq:listener config-ref="config" destination="#[vars.destination]">
  <ibm-mq:response priority="8" persistentDelivery="true">
      <ibm-mq:body>#['Message received was: ' ++ payload]</ibm-mq:body>
      <ibm-mq:properties>#[{'processedAt': now}]</ibm-mq:properties>
  </ibm-mq:response>
</ibm-mq:listener>

This response builder allows you to configure not only the body and properties of the response message but also allows you to specify any header like priority and persistentDelivery. All these configurations impact the outbound message and can be built using all the information available in the flow when the processing is completed.

Listening for Messages with a Topic Subscription

Listening for messages from a topic destination is very similar to listening for them from a queue, but with the extra functionality of being able to use topic subscriptions to share state between consumers. The syntax for subscribing to a topic is:

<ibm-mq:listener config-ref="JMS_config" destination="#[vars.destination]">
    <ibm-mq:consumer-type>
        <ibm-mq:topic-consumer/>
    </ibm-mq:consumer-type>
</ibm-mq:listener>

All the listener parameters remain the same, but now you can handle the subscription configuration in the topic-consumer parameter.

For details on how to configure the topic subscriptions see Using Topic Subscriptions.

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub