You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by prademak <p....@huizemolenaar.nl> on 2009/03/31 15:13:49 UTC
Setting message selector synchronously?
I'm setting the message selector for a non-persistent topic subscription at
runtime via the
ActiveMQActivationSpec.setMessageSelector and then restarting the
org.jencks.JCAConnector as follows:
...
logger.info("Setting selector to: " + selector);
activemqActivationSpec.setMessageSelector(selector);
jcaConnector.destroy();
jcaConnector.setActivationSpec(activemqActivationSpec);
jcaConnector.start();
Thread.sleep(WAIT_FOR_SELECTOR_SET_MS); // Wait for the selector to be
set/activated on the broker
...
(I'm using ActiveMQ 5.2.0 and Jencks 2.1)
Apparently, the message selector is set asynchronously, since when in my
tests I directly start sending messages after the call to
setMessageSelector(..) and restarting the connector, I still receive
messages that should have been rejected based on the new selector. However,
if I wait for a few seconds, and then start sending the messages, everything
seems to be working fine.
I ran into the same issue when I was using Spring's JmsTemplate +
DefaultMessageListenerContainer.
(I've moved from JmsTemplate to Jencks to prevent me
from missing messages ( http://activemq.apache.org/jmstemplate-gotchas.html
JmsTemplate gotchas ))
When using Spring I set the message selector in the following way:
...
DefaultMessagListenerContainer dmlc;
...
String selector = JMSSelectorCreator.createJMSKeySelector(allKeys);
dmlc.setMessageSelector(selector);
if (dmlc.getCacheLevel() > DefaultMessageListenerContainer.CACHE_CONSUMER) {
logger.warn("Cache level of DefaultMessageListenerContainer is >
CACHE_CONSUMER, therefore a restart of the container is required to
activate" +
" a new Message Selector. Consider setting a lower cache level.");
dmlc.shutdown();
dmlc.initialize();
}
Thread.sleep(WAIT_FOR_SELECTOR_SET_MS);
...
However, as noted before, waiting for the message to be set/activated was
still required.
Which leads me to my question:
Is there any way of getting notified when the message selector has been
set/activated on the broker?
(I've looked into Advisory messages, but these don't seems to provide
information on selectors) Or is there a method to set the selector that
blocks until the selector has actually been set/activated on the server?
Thanks,
Peter
--
View this message in context: http://www.nabble.com/Setting-message-selector-synchronously--tp22804912p22804912.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.