technology-note/springboot整合activeMQ(1).md

165 lines
60 KiB
Markdown
Raw Normal View History

2018-07-22 20:15:03 +08:00
# <div align="center">springboot与activeMQ入门1</div>
**说明acitveMQ版本为5.9.1springboot版本为2.0.3**<br/>
## 一. 下载安装windows
&emsp;&emsp;官方下载地址:[点我跳转](http://activemq.apache.org/download-archives.html),选择windows安装包下载,然后解压解压后运行bin目录下的**activemq.bat**启动服务,无报错即可启动成功。默认管理地址为:[localhost:8161/admin](localhost:8161/admin),默认管理员账号密码为**admin**/**admin**。
## 二. springboot整合
### &emsp;1. 创建springboot项目
&emsp;&emsp;创建springboot web项目加入spring-boot-starter-activemq依赖。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
```
&emsp;&emsp;然后编辑配合文件加上一个配置61616为activeMQ的默认端口暂时不做其他配置使用默认值。
```yml
spring:
activemq:
broker-url: tcp://localhost:61616
```
### &emsp;2. 创建生产者消费者
&emsp;&emsp;springboot中activeMQ的默认配置为**生产-消费者模式**,还有一种模式为**发布-订阅模式**后面再讲。项目目录如下:
![项目目录][pic1]
&emsp;&emsp;首先编写配置类Config.java代码如下
```java
@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");
}
}
```
上面的代码建立了两个消息队列queue1queue2,分别由queue1和queue2这两个Bean注入到Spring容器中。程序运行后会在activeMQ的管理页面->queue中看到如下
![队列][quenes]
&emsp;&emsp;生产者Producer.java代码如下
```java
@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中发送消息。
消费者Comsumer.java代码如下
```java
@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个消费者每两个消费一个消息队列。
## &emsp;3. 运行
&emsp;&emsp;启动项目后分别向/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
```
消息都成功被消费者消费,从打印结果也可看出生产者消费者的一个特点:一个消息只会被一个消费者消费。同时在管理页面中可以看到:
![运行结果][quenes1]
每个消息队列有两个消费者队列进入了三个消息出了三个消息说明消息都被消费掉了如果注释掉消费者代码再次运行然后发送消息就会发现MessagesEnqueued数量大于MessagesDequeued然后再让消费者上线会立即消费掉队列中的消息。
[quenes1]:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwsAAADPCAMAAACN6b23AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQkM4QzdCNDhCRkIxMUU4ODI0Njg4NzZGNEY3MDFFRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQkM4QzdCMzhCRkIxMUU4ODI0Njg4NzZGNEY3MDFFRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHN0UmVmOmRvY3VtZW50SUQ9IkUxOEU0MDkxMjNGQzJDQzYzQTNGNUQwOThDNTYzMEIyIi8+IDxkYzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJkZjpsaT5meGI8L3JkZjpsaT4gPC9y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
[quenes]:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABIEAAADiCAMAAADuxycUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4ppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDMTJBNEQ2NDhCRkExMUU4OTg0QkZCREMxQ0Y4NjcxQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDMTJBNEQ2MzhCRkExMUU4OTg0QkZCREMxQ0Y4NjcxQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHN0UmVmOmRvY3VtZW50SUQ9IkExRDQ2NjA5OTQ0NUU2MTI5NjEwRjgwQkY1RTRGNDBGIi8+IDxkYzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJkZjpsaT5meGI8L3JkZjpsaT4gPC9y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
[pic1]:data:image/png;base64,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