Fuse Message Broker supports using JMS message selectors to filter messages. When using JMS message selectors with a network of brokers, you need to be aware of how the message selectors interact with conduit subscriptions. The interaction can lead to some undesirable outcomes if not properly managed.
JMS message selectors allow consumers to filter messages by testing the contents of a message's JMS header. The selectors are specified when the consumer connects to a broker and starts listing to messages on a particular destination. The broker then filters the messages that delivered to the consumer.
Brokers in a network also use JMS message selectors to determine how messages are routed. A consumer's message selectors are included in the subscription information propagated throughout the network. All of the brokers can then use this information to filter messages before forwarding messages through a network connector.
The one instance where message selectors are not used is when one or more consumer subscriptions are combined into a conduit subscription. This means that the broker receiving the conduit subscription cannot use the message selectors when determining what messages to forward.
Trouble arises when message selectors are combined with conduit subscriptions for consumers that are listening on the same queue.
Consider the broker network shown in Figure 5.1.
Consumers C1 and C2 subscribe to the same queue and they also define JMS message selectors.
C1 selects messages for which the region
header is equal to us
. C2
selects messages for which the region
header is equal to
emea
.
The consumer subscriptions, s1
and s2
, automatically propagate
to broker A. Because these subscriptions are both on the same queue broker A combines the
subscriptions into a single conduit subscription, cs
, which does
not include any selector details. When the producer P starts sending
messages to the queue, broker A forwards the messages alternately to broker B and broker C
without checking whether the messages satisfy the relevant
selectors.
The best case scenario is that, by luck, the messages are forwarded to the broker with
a selector that matches the message. The worst case scenario is that all of the messages for
region emea
end up on broker B and all of the messages for region
us
end up on broker C. Chances are that the result would be somewhere in the
middle. However, that means that at least some messages will sit at a broker where they will
never be consumed.
If the consumers were both listening to a topic instead of a queue broker A would send a copy of every message to both networked brokers. All of the messages would get processed because C1 would consume the messages for the US region and C2 would consumer the messages for the EMEA region. However, any messages for the EMEA region would sit unconsumed in broker C and any messages for the US region would sit unconsumed in broker B.
When you are faced with a network of brokers suffering from the effects of combining conduit subscriptions and message selectors and the consumers are listening to a queue, the easiest solution is to disable conduit subscriptions at the network connector where the problem arises.
You disable conduit subscriptions by setting the
networkConnector
element's
conduitSubscriptions
to false
.
Example 5.1 shows configuration for a network connector
with conduit subscriptions disabled.
Example 5.1. Disabling Conduit Subscriptions
<networkConnectors> <networkConnector name="linkToBrokerB" uri="static:(tcp://localhost:61002)" networkTTL="3" conduitSubscriptions="false" /> </networkConnectors>
If the problem arises using topics, the solution is more difficult. Disabling conduit subscriptions will cause more problems. In this case, you will need to rethink the requirements of your application. If you must use message selectors with topics in a network of brokers, you have two options:
ensure that your network topology is such that messages won't be sent to brokers without appropriate consumers
ensure that the orphaned messages will not create issues in your application