使用主题和队列处理@JmsListener的更简单方法

时间:2016-07-05 15:51:03

标签: java spring jms spring-jms

我正在为应用程序进行原型设计,以测试未来应用程序的弹出消息传递功能。

我知道我们需要的一件事是在同一个应用程序中处理来自activemq的主题和队列。因此,在同一个bean中,我应该有一个@JmsListener注释的方法,它将听到一个队列,另一个会听到一个主题。那可能吗?

更简单的方法是什么?我看到了一些使用spring-jms(如this one)的主题的答案,但在这种情况下,我想我需要创建两个DefaultMessageListenerContainer,一个用于主题,另一个用于队列。这是最好的解决方案吗?

此问题是否有任何注释方法?

2 个答案:

答案 0 :(得分:4)

以下是如何使用spring boot设置第二个容器工厂的完整示例:

JmsDemoApplication.java:

import tensorflow as tf

a = tf.Variable([0.1, 0.5])
b = tf.Variable([0.2, 0.6])

auc = tf.contrib.metrics.streaming_auc(a, b)

sess = tf.Session()
sess.run(tf.initialize_all_variables())
sess.run(tf.initialize_local_variables()) # try commenting this line and you'll get the error
train_auc = sess.run(auc)

print(train_auc)

MessageListenerBean.java:

package net.lenthe;

import javax.jms.ConnectionFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;

@SpringBootApplication
public class JmsDemoApplication {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean(name = "topicJmsListenerContainerFactory")
    public DefaultJmsListenerContainerFactory getTopicFactory() {
        DefaultJmsListenerContainerFactory f = new  DefaultJmsListenerContainerFactory();
        f.setConnectionFactory(connectionFactory);
        f.setSessionTransacted(true);
        f.setPubSubDomain(true);
        return f;
    }

    public static void main(String[] args) {
        SpringApplication.run(JmsDemoApplication.class, args);
    }
}

答案 1 :(得分:1)

框架将负责为每个@JmsListener创建一个容器;您只需要通过containerFactory属性告诉它使用哪个容器工厂。