【发布时间】:2016-08-19 15:13:10
【问题描述】:
我有一个带有 ActiveMQ JMS 的 spring-boot 应用程序。我在应用程序中有一个队列,它将获取带有字符串属性的消息,比如颜色。颜色的值可以是红色、绿色或蓝色。应用程序有一个 Rest 服务,它将获取颜色列表 {一个或多个},在侦听队列上的消息时应该将其用作 SELECTOR。在应用程序的整个生命周期中,这可能会发生变化,因此 SELECTOR 的值可能看起来像 "color='red'"、"color='blue' OR color='red'" 或 "color='green'" .
@Bean
MessageListenerAdapter adapter() {
return new MessageListenerAdapter(new Object() {
// message handler
});
}
@Bean
DefaultMessageListenerContainer container(ConnectionFactory cf) throws Exception {
DefaultMessageListenerContainer c = new DefaultMessageListenerContainer();
c.setMessageListener(adapter());
c.setConcurrency(this.concurrency);
c.setMessageSelector(this.selector);
c.setConnectionFactory(cf);
c.setDestinationName(this.q);
return c;
}
计划使用上面的代码来实现这一点; code works fine to start with initial selector, however when selector needs to change following code does not work.
c.stop();
// modify value of selector
c.setMessageSelector(this.selector);
c.start();
看起来,我有一个可行的解决方案。我将 @Scope("prototype") 放在方法 container() 之上,并且有一个方法可以在选择器更改时实例化一个新的 DefaultMessageListenerContainer。
public void xx(String selector) {
this.selector = selector;
DefaultMessageListenerContainer c =
context.getBean("container", DefaultMessageListenerContainer.class);
c.start();
}
这是解决这个问题的正确方法吗? Also, when selector changes and I instantiate a new DefaultMessageListenerContainer, what's the correct way to shutdown/stop existing DefaultMessageListenerContainer?
问候, 修行者
【问题讨论】:
标签: spring spring-boot activemq