生产者应用的搭建:
1、添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
2、在application.properties文件中添加activeMQ的配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
spring.activemq.user=admin
spring.activemq.password=admin
spring.jms.pub-sub-domain=false
其中,
broker-url是activeMQ服务器地址,端口61616是在/config/activmq.xml中name="openwire"的配置对应的端口;
user和password是在activeMQ服务器的/config/user.properites中的配置;
注意pub-sub-domain配置,如果该配置为true,表示该springboot支持topic模式的消息,如果为false,表示支持queue模式的消息。两者不能同时支持;
3、通过JmsMessagingTemplate生产消息
生产者通过JmsMessagingTemplate来生产消息,具体api为:
jmsMessagingTemplate.convertAndSend(Destination destination, String msg);
其中Destination是一个空接口,它的两个子接口为Topic和Queue,分别表示主题和队列两种模式的消息
ActiveMQ中提供了ActiveMQTopic和ActiveMQQueue两个实现类,分别实现Topic和Queue接口。这两个实现类通过new ActiveMQQueue(String name)的构造器实例化。构造器中的name表示了该队列的名称,在消费者中通过这个名称监听队列的消息;
消费者应用的搭建:
1、添加maven依赖
<参照前文>
2、在application.properties文件中添加activeMQ的配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
spring.activemq.user=admin
spring.activemq.password=admin
spring.jms.pub-sub-domain=false
注意pub-sub-domain配置与生产者的配置含义一样。
3、通过@JmsListener监听消息
@JmsListener(destination = "promoteAct")
public void receiveQueue(String msg) {
System.out.println(msg+"消息已经消费了,消费者1");
}
@JmsListener注解中的destination属性,指向消息队列的name,也就是在生产者中构造消息队列时的实参。
其他
1、生产者和消费者并没有绝对的区分,同一个应用,既可以是生产者,也可以是消费者。
2、消费者收到消息之后,可以通过@SendTo注解再将消息继续传播出去,当使用@SendTo注解就隐性创建了一个队列(或主题,取决于原始消息的类型),这个消息队列同样可以通过@JmsListener的形式被监听到;
@JmsListener(destination = "topicAct")
@SendTo("another_topic")
public String receiveTopic(String consumer) {
System.out.println(consumer + "___ topic 消息已经消费了,消费者2");
return "继续转发的消息";
}
疑问:
1、消息的持久化
2、集群配置