本篇文章主要是讲SpringBoot集成activeMQ实现Queue模式点对点通信
Posted 码技术秘圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本篇文章主要是讲SpringBoot集成activeMQ实现Queue模式点对点通信相关的知识,希望对你有一定的参考价值。
本篇文章主要是讲SpringBoot集成activeMQ实现Queue模式点对点通信。首先来讲一讲什么是MQ:Message Queue 消息队列;MQ可以理解为现实生活中的邮局,当A给物品给B时,A无需直接去找B当面去将物品交给B,A可以通过邮局寄送,然后B通过查询快递信息(监听),知道物品达到邮局,然后B自己去邮局取即可。
消息队列的2种通信模式:
point-to-point:点对点(queue)
特点:点对点并不是只A发送的消息只能指定B接收,而是只A发送的任意一条消息只能由一个人接收处理,也就是每条消息只能被消费一次。
1)一个消息只能被一个服务接收
2)消息一旦被消费,就会消失
3)如果没有被消费,就会一直等待,直到被消费
4)多个服务监听同一个消费空间,先到先得
publish/subscribe发布/订阅模式(topic)
特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息。
1)一个消息可以被多个服务接收
2)订阅一个主题的消费者,只能消费自它订阅之后发布的消息。
3)消费端如果在生产端发送消息之后启动,是接收不到消息的,除非生产端对消息进行了持久化(例如广播,只有当时听到的人能听到信息)
Queue模式:
点对点通信,每个消息只有一个消费者,消息保证送达,离线消费者可以在下次上线后收到之前积压的消息。
下面我们就来看看queue在程序中是怎么实现的:
①:配置pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.40</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
②:application.yml配置
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
queue: wucy-queue
server:
port: 8080
③:关于queue的配置QueueConfig.java
@Configuration
public class QueueConfig {
@Value("${queue}")
private String queue;
@Bean
public Queue wucyQueue() {
return new ActiveMQQueue(queue);
}
}
④:创建生产者,使用junit来实现
1.实现发送服务:
@Component
public class SenderServer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
public void send(String msg) {
jmsMessagingTemplate.convertAndSend(queue, msg);
}
}
2.使用junit调用发送服务
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootJmsApplicationTests {
@Autowired
private SenderServer mqServer;
@Test
public void register() {
for (int i = 0; i < 10; i++) {
long startTime = System.currentTimeMillis();
// 数据库的操作
try {
Thread.sleep(50);
// 为了提高用户体验
// 发短信,去调用别人的API
// mqServer.send("发送短信*******");
// Thread.sleep(1000);
// 发邮件,qq发邮件的smtp
JSONObject json = new JSONObject();
json.put("type", "email");
json.put("to", "307980463@qq.com");
json.put("content", "恭喜你注册成功,"+"用户"+i);
mqServer.send(json.toJSONString());
// Thread.sleep(1000);
} catch (InterruptedException e) {
}
long endTime = System.currentTimeMillis();
System.out.println("你注册成功,用户名为:" + "用户"+i + ",耗时:" + (endTime - startTime));
}
}
}
⑤创建两个消费者
@Component
public class Consumer {
@JmsListener(destination = "${queue}")
public void receive(String msg) {
System.out.println("监听器1收到msg:" + msg);
JSONObject parseObject = JSONObject.parseObject(msg);
String type = (String) parseObject.get("type");
String to = (String) parseObject.get("to");
String content = (String) parseObject.get("content");
if ("email".equals(type)) {
System.out.println("发送邮件到:"+to+",内容为:"+content);
}
}
}
@Component
public class Consumer2 {
@JmsListener(destination = "${queue}")
public void receive(String msg) {
System.out.println("监听器2收到msg:" + msg);
JSONObject parseObject = JSONObject.parseObject(msg);
String type = (String) parseObject.get("type");
String to = (String) parseObject.get("to");
String content = (String) parseObject.get("content");
if ("email".equals(type)) {
System.out.println("发送邮件到:"+to+",内容为:"+content);
}
}
}
运行App.java
即可看到:
可以发现监听器(即消费者)都收到了一定数量的消息。
查看activeMQ的控制台:
可以看到当前有2个消费者,0条未被消费的消息,21条已生产的消息,21条被消费的消息。
此篇文章讲了queue模式,下期会出topic模式,请给位看官关注码技术秘圈继续关注
以上是关于本篇文章主要是讲SpringBoot集成activeMQ实现Queue模式点对点通信的主要内容,如果未能解决你的问题,请参考以下文章
Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)
SpringBoot 源码解析 ----- Spring Boot 精髓:集成AOP