You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by prademaker <pe...@gmail.com> on 2009/03/31 16:16:22 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 after the call to setMessageSelector(..) and restarting the connector
I directly start sending messages to the topic, I still receive messages
that should have been rejected based on the new selector. 
However, if I wait for a few seconds, and then send the messages, the
selector does seem to be set/activated and the correct messages are
received. 

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 seem to provide
information about 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-tp22804951p22804951.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.