默认情况下@JmsListener不能监听topic,需要添加工厂类
package jms;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
@Configuration
@EnableJms //启用jms功能
public class ActiveMqConfig {
//如果要使用topic类型的消息,则需要配置该bean
@Bean("jmsTopicListenerContainerFactory")
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(
ConnectionFactory connectionFactory
){
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true); //这里必须设置为true,false则表示是queue类型
return factory;
}
}
public void sendMessageTopic(ActiveMQTopic destination,String message) {
jmsTemplate.convertAndSend(destination,"这是一个广播");
}
@JmsListener(destination = "mytest.topic",containerFactory = "jmsTopicListenerContainerFactory")
public void receiveToic(String text){
System.out.println(text);
}
@Test
public void sendMessageTopic()throws Exception{
ActiveMQTopic destination = new ActiveMQTopic("mytest.topic");
producer.sendMessageTopic(destination,"你好,ActiveMQ");
}
刚才出现了一个问题,在topic消费后也返回了一个提示信息,但是报错了
对于点对点消费者来说, 我可以给发送者回一条消息,告诉他我收到消息了,但是对于topic,发送者对接受者是否接受到消息不感兴趣,所以在发送者如果回送消息的时候会报错。
最后一个比较重要的知识点:对于queue来说,我们的消息发送出去,会一直保存在服务器上,等待消费者消费他,如果此时没有消费者在线,会一直等待,会把消息做持久化处理,保存在硬盘上,如果消费者上线,消费者就能监听到这条消息并进行消费。
对于topic来说,我一条消息发送出去,可能会有多个消费者去消费,如果这个时候消费者不在线,默认情况下,等消费者上线,他也无法收到这条消息,相当于这条消息丢失了。
也可以配置topic的持久化,保证消费者不在线的情况下,也能收到这条消息,那这跟queue的机制就类似了。
==特殊情况:如果消息发送失败怎么办?一直失败怎么办?==
==消息的重试机制,死信队列==