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模式,请给位看官关注码技术秘圈继续关注

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值