springboot基础(6):整合ActiveMQ

2022年12月4日12:27:44

安装ActiveMQ

https://blog.csdn.net/u011628753/article/details/123370072?spm=1001.2014.3001.5501


springboot整合ActiveMQ

(生产者消费者模型)

  1. 新建模块,选择springboot项目

  2. 导入依赖坐标

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dependency>

3.新建接口和实现

packagecom.it2.service;publicinterfaceOrderService{publicvoidorder(String id);}
packagecom.it2.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassOrderServiceActiveMqImplimplementsOrderService{@AutowiredprivateMessageService messageService;@Overridepublicvoidorder(String id){System.out.println("用户下单,订单id:"+id+", start");
        messageService.sendMessage(id);System.out.println("用户下单,订单id:"+id+", end");System.out.println();}}
packagecom.it2.service;publicinterfaceMessageService{voidsendMessage(String  id);StringdoMessage();}
packagecom.it2.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jms.core.JmsMessagingTemplate;importorg.springframework.stereotype.Service;@ServicepublicclassMessageActiveMqServiceImplimplementsMessageService{@AutowiredprivateJmsMessagingTemplate messagingTemplate;@OverridepublicvoidsendMessage(String id){System.out.println("将消息加入队列(activemq),id:"+ id);
        messagingTemplate.convertAndSend("message.queue.id", id);System.out.println("====================================================");}@OverridepublicStringdoMessage(){System.out.println("处理消息结束");String id= messagingTemplate.receiveAndConvert("message.queue.id",String.class);return id;}}
  1. 新建controller
packagecom.it2.controller;importcom.it2.service.OrderService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassOrderController{@AutowiredprivateOrderService orderService;@GetMapping("/order/{id}")publicStringorder(@PathVariableString id){System.out.println("用户下单");
        orderService.order(id);return"hello ,"+id;}}
packagecom.it2.controller;importcom.it2.service.MessageService;importcom.it2.service.OrderService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassMessageController{@AutowiredprivateMessageService messageService;@GetMapping("/sendMessage")publicStringsendMessage(){System.out.println("处理发送短信");String id= messageService.doMessage();return"send message ,"+id;}}
  1. 配置application.yml文件
spring:activemq:broker-url: tcp://127.0.0.1:61616
  1. 启动项目
  • (1)发起订单请求127.0.0.1:8080/order/1,可以多发几次。
    springboot基础(6):整合ActiveMQ
  • (2)处理队列中的短信发送业务127.0.0.1:8080/sendMessage,每次执行会处理一条,如果没有消息,则会监听等待直到有任务进入队列。
    springboot基础(6):整合ActiveMQ

监听模式处理消息

简单的监听处理任务

上面的情况,明显每次下单发短信,处理短信的时候,都需要调用MessageController去处理短信发送任务,明显不符合实际开发要求,那么我们改用监听器模式实现队列中的任务处理。

  1. 新建MessageListenerActiveMq注解成为组件。
packagecom.it2.service.listener;importorg.springframework.jms.annotation.JmsListener;importorg.springframework.stereotype.Component;@ComponentpublicclassMessageListenerActiveMq{@JmsListener(destination="message.queue.id")publicvoidreceive(String id){System.out.println("执行短信的发送(ActiveMq)id:"+id);}}
  1. 启动项目,发起订单请求:127.0.0.1:8080/order/1, 监听器将会处理这些任务。
    springboot基础(6):整合ActiveMQ

串行队列任务处理

假设我的业务业务要求发送短信之后,还需要发送email,可以利用@SendTo将结果继续发送到新的队列处理,例如

packagecom.it2.service.listener;importorg.springframework.jms.annotation.JmsListener;importorg.springframework.messaging.handler.annotation.SendTo;importorg.springframework.stereotype.Component;/**
 * 组件
 */@ComponentpublicclassMessageListenerActiveMq{/**
     * 注解SendTo是将方法的返回值添加到mail.queue.id的队列,所以不能是void的方法
     * @param id
     * @return
     */@JmsListener(destination="message.queue.id")@SendTo("mail.queue.id")publicStringreceive(String id){System.out.println("执行短信的发送(ActiveMq)id:"+id);return"mail-"+id;}@JmsListener(destination="mail.queue.id")publicvoidreceive2(String id){System.out.println("执行email的发送(ActiveMq)id:"+id);}}

执行结果
springboot基础(6):整合ActiveMQ


使用默认队列

不推荐使用此方法
如下代码变动(MessageActiveMqServiceImpl)

packagecom.it2.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jms.core.JmsMessagingTemplate;importorg.springframework.stereotype.Service;@ServicepublicclassMessageActiveMqServiceImplimplementsMessageService{@AutowiredprivateJmsMessagingTemplate messagingTemplate;@OverridepublicvoidsendMessage(String id){System.out.println("将消息加入队列(activemq),id:"+ id);//        messagingTemplate.convertAndSend("message.queue.id", id);//自定义队列
        messagingTemplate.convertAndSend(id);//使用默认队列System.out.println("====================================================");}@OverridepublicStringdoMessage(){System.out.println("处理消息结束");//        String id = messagingTemplate.receiveAndConvert("message.queue.id", String.class);//自定义队列String id=messagingTemplate.receiveAndConvert(String.class);//读取默认队列return id;}}

当使用默认队列时,必须配置默认队列名,否则执行时将会报错。
springboot基础(6):整合ActiveMQ

application.yml

spring:activemq:broker-url: tcp://127.0.0.1:61616jms:template:default-destination:"it2"#设定默认的队列名,如果使用默认队列时,必须设置此项
  • 作者:逆水行舟没有退路
  • 原文链接:https://lengcz.blog.csdn.net/article/details/123383468
    更新时间:2022年12月4日12:27:44 ,共 5071 字。