关于activeMq的学习 (一个项目内queue和topic两者消息模式共存)
1.发送者:
///发送消息 queue
@RequestMapping("/send")
public void send(String msg) {
for(int i=0;i<30;i++){
jmsTemplate.convertAndSend(new ActiveMQQueue(MQQueueType.MQ_STUDY), i+":send queue: MQ_STUDY"+msg);
}
}
///发送消息 topic
@RequestMapping("/sendt")
public void sends(String msg) {
for(int i=0;i<30;i++){
jmsTemplate.convertAndSend(new ActiveMQTopic(MQQueueType.MQ_STUDY), i+":send topic MQ_STUDY:"+msg);
}
}
2.消费者
//destination是指 该消费者监听的队列名称 containerFactory为指定监听容器工厂
//queue
@JmsListener(destination = MQQueueType.MQ_STUDY , containerFactory = "queueListenerFactory")
public void receiveMessage(String text) {
log.info("【*** " + MQQueueType.MQ_STUDY + " 接收消息 queue ***】" + text);
}
//tocic
@JmsListener(destination = MQQueueType.MQ_STUDY , containerFactory = "topicListenerFactory")
public void receiveMessagetoc(String text) {
log.info("【*** " + MQQueueType.MQ_STUDY + " 接收消息 topic ***】" + text);
}
3.监听工厂
@Bean
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConcurrency("1");
factory.setConnectionFactory(connectionFactory);
return factory;
}
测试结果:
这里启动了两个相同的项目进行测试:
1.topic 测试结果:两个topic 消费者 收到消息一致,并且 queue未收到消息 ,成功。
2. queue 测试结果:两个queue消费者 收到消息不一致,并且 未重复 ,成功。
yml配置: (当前测试数据 的配置 是开启了 topic模式,共存模式是否需要配置不清楚 ---未测--)
spring:
jms:
#topic模式需要配置为true
pub-sub-domain: true
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
in-memory: true
#true表示使用连接池
pool:
enabled: false
non-blocking-redelivery: false