说明:acitveMQ 版本为:5.9.1,springboot 版本为 2.0.3html
官方下载地址:点我跳转,选择 windows 安装包下载,而后解压,解压后运行 bin 目录下的activemq.bat启动服务,无报错便可启动成功。默认管理地址为:localhost:8161/admin,默认管理员帐号密码为admin/admin。java
建立 springboot web 项目,加入 spring-boot-starter-activemq 依赖。git
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
复制代码
而后编辑配合文件,加上一个配置:61616 为 activeMQ 的默认端口,暂时不作其余配置,使用默认值。github
spring:
activemq:
broker-url: tcp://localhost:61616
复制代码
springboot 中 activeMQ 的默认配置为生产-消费者模式,还有一种模式为发布-订阅模式后面再讲。项目目录以下:web
首先编写配置类 Config.java,代码以下spring
@Configuration
public class Config {
@Bean(name = "queue2")
public Queue queue2(){
return new ActiveMQQueue("active.queue2");
}
@Bean(name = "queue1")
public Queue queue1(){
return new ActiveMQQueue("active.queue1");
}
}
复制代码
上面的代码创建了两个消息队列 queue1,queue2,分别由 queue1 和 queue2 这两个 Bean 注入到 Spring 容器中。程序运行后会在 activeMQ 的管理页面->queue 中看到以下:apache
生产者 Producer.java 代码以下:windows
@RestController
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired()
@Qualifier("queue2")
private Queue queue2;
@Autowired()
@Qualifier("queue1")
private Queue queue1;
@GetMapping("/queue2")
public void sendMessage1(String message){
jmsMessagingTemplate.convertAndSend(queue2,"I'm from queue2:"+message);
}
@GetMapping("/queue1")
public void sendMessage2(String message){
jmsMessagingTemplate.convertAndSend(queue1,"I'm from queue1:"+message);
}
}
复制代码
上面的类建立了两个 GET 接口,访问这两个接口分别向 queue1 和 queue2 中发送消息。springboot
消费者 Comsumer.java 代码以下:bash
@Component //将该类注解到Spring 容器中
public class Comsumer {
//接受消息队列1消息
@JmsListener(destination = "active.queue1") //监听active.queue1消息队列
public void readActiveQueue11(String message){
System.out.println(1+message);
}
//接受消息队列1消息
@JmsListener(destination = "active.queue1")
public void readActiveQueue12(String message){
System.out.println(2+message);
}
//接受消息队列2消息
@JmsListener(destination = "active.queue2")
public void readActiveQueue21(String message){
System.out.println(1+message);
}
//接受消息队列2消息
@JmsListener(destination = "active.queue2")
public void readActiveQueue22(String message){
System.out.println(2+message);
}
}
复制代码
上面的代码定义了 4 个消费者,每两个消费一个消息队列。
启动项目后分别向/queue1?message=niihao,/queue2?message=nihaoa 发送 http 请求,而后咱们能够在控制台中看到以下输出:
2I'm from queue2:nihaoa 1I'm from queue2:nihaoa
2I'm from queue1:nihao 1I'm from queue1:nihao
复制代码
消息都成功被消费者消费,从打印结果也可看出生产者消费者的一个特色:一个消息只会被一个消费者消费。同时在管理页面中能够看到:
每一个消息队列有两个消费者,队列进入了三个消息,出了三个消息,说明消息都被消费掉了,若是注释掉消费者代码,再次运行,而后发送消息就会发现 MessagesEnqueued 数量大于 MessagesDequeued,而后再让消费者上线会当即消费掉队列中的消息。
本文原创发布于:www.tapme.top/blog/detail…