一、简介
springboot拥有着空前强大的整合能力,自然也对消息提供了支持。它整合了activeMQ。我们可以简单地引入依赖,通过注解来使用它。
二、依赖
<!--activemq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>${activemq-pool.version}</version> </dependency>
如上,我们引入了activemq依赖,以及用于池化的依赖
三、配置外部服务端
消息的服务端一般是与程序分离的,所以虽然springboot内嵌了activeMQ,我们依赖选择外部配置,在application.properties文件中添加:
# activeMQ spring.activemq.broker-url=tcp://IP:61616 spring.activemq.user=用户名 spring.activemq.password=密码 # pool spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=50
四、点对点
springboot自动配置的activeMQ是默认点对点的,我们可以轻松定义生产者和消费者:
扫描二维码关注公众号,回复:
67783 查看本文章
@Autowired private JmsMessagingTemplate jmsMessagingTemplate; /** * 生产者 */ public void sendMessage() { jmsMessagingTemplate.convertAndSend(new ActiveMQQueue("queue1"), "message content"); } /** * 消费者 */ @JmsListener(destination = "queue1") public void consumeMessage(String message){ System.out.println("consumer1: " + message); }
如上,我们使用jmsMessageTemplate模板发送了点对点的消息,@JmsListener注解的方法用以消费消息。
五、发布订阅
Springboot默认是点对点的,所以如果我们要使用发布订阅需要自定义一个: JmsListenerContainerFactory的Bean
如:
@Bean public JmsListenerContainerFactory myJmsListenerContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); // 开启发布订阅模式 factory.setPubSubDomain(true); factory.setConnectionFactory(connectionFactory); return factory; }
那么使用的代码将改成如下的样子:
@Autowired private JmsMessagingTemplate jmsMessagingTemplate; public void sendMessage() { jmsMessagingTemplate.convertAndSend(new ActiveMQTopic("topic"), "message content"); } @JmsListener(destination = "topic", containerFactory = "myJmsListenerContainerFactory") public void consumeMessage(String message){ System.out.println("consumer1: " + message); } @JmsListener(destination = "topic", containerFactory = "myJmsListenerContainerFactory") public void consumeMessage2(String message){ System.out.println("consumer2: " + message); }
注意:
1)我们在创建Destination的时候用的是ActiveMQTopic实例而不是ActiveMQQueue实例,这表示一个topic消息;
2)@JmsListener注解中,我们将JmsListenerContainerFactory的bean实例添加到了containerFactory的注解上;
3)以及,我们定义了多个JmsListener用来消费消息。