当前位置: 首页 > news >正文

如何使用Spring Context实现消息队列

说明:MQ 组件有很多,有 Kafka、Rabbit MQ、Rabbit MQ,如果不想引入这些组件,还能依靠 Redis 作为 MQ 组件,另外,如果不像引入 MQ 组件,仅想实现某些方法的异步操作,还能使用 Spring Boot 中自带的 @Async 注解。

相关博客

  • Kafka简单使用

  • RabbitMQ安装及简单使用

  • RocketMQ安装和简单使用

  • 如何用Redis作为消息队列

本文介绍如何使用 Spring Context 实现消息队列

实现

定义一个消息对象,如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 消息对象*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyMessage {private String messageId;private String message;
}

消息生产者,使用 ApplicationContext 推送消息

import com.hezy.service.mq.message.MyMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** 消息生产者*/
@Slf4j
@Component
public class MyProducer {@Resourceprivate ApplicationContext applicationContext;public void sendMyMessage(String messageId, String message) {MyMessage myMessage = new MyMessage(messageId, message);applicationContext.publishEvent(myMessage);}
}

消息消费者,接收消息,并转发到指定实现类执行

import com.hezy.service.DemoService;
import com.hezy.service.mq.message.MyMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** 消息消费着*/
@Slf4j
@Component
public class MyConsumer {@Resourceprivate DemoService demoService;@EventListener@Async // Spring Event 默认在 Producer 发送的线程,通过 @Async 实现异步public void onMessage(MyMessage message) {log.info("[onMessage][消息内容({})]", message);demoService.doMyMessage(message);}
}

消费方法

import com.hezy.service.mq.message.MyMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class DemoServiceImpl implements DemoService {/*** 消息消费方法** @param message 消息*/@Overridepublic void doMyMessage(MyMessage message) {log.info("收到消息:{}, 去做一些事情", message);}
}

写一个接口,推送消息

import com.hezy.service.mq.message.MyMessage;
import com.hezy.service.mq.producer.MyProducer;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController
@RequestMapping("/demo")
public class DemoController {@Resourceprivate MyProducer myProducer;@PostMapping("/put")private void test(@RequestBody MyMessage myMessage) {myProducer.sendMyMessage(myMessage.getMessageId(), myMessage.getMessage());}
}

以上代码,pom.xml 如下,功能实现仅使用了 Spring Boot 框架

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent><groupId>com.hezy</groupId><artifactId>spring_context_demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

启动,调用该接口

在这里插入图片描述

控制台可见消息被消费

在这里插入图片描述

另外

推送消息是异步操作,如下,在推送消息后线程休眠10秒,消息也会在接口返回结果之前被消费。

    @PostMapping("/put")private void test(@RequestBody MyMessage myMessage) throws InterruptedException {myProducer.sendMyMessage(myMessage.getMessageId(), myMessage.getMessage());Thread.sleep(10000L);System.out.println("返回结果");}

在这里插入图片描述

消息推送给消费者,是通过消息对象来识别的,只要消息消费者的参数是消息对象,就能接收到该消息。

如果定义了多个消费者,参数是同一个消息对象,这些消费者都能接收到该消息,是广播的方式,如下:

在这里插入图片描述

总结

本文介绍了如何使用Spring Context实现异步消息

http://www.dtcms.com/a/532931.html

相关文章:

  • Python数据分析中,如何使用Docker Compose管理多个容器?
  • 济南建设网站企业收费公司网站建设的目的和意义
  • 注册了域名怎样做网站中国建设银行怎么查询余额
  • 【类与对象(中)】C++类默认成员函数全解析
  • 北京网站开发最专业的公司浏览器网址链接
  • 使用 Actix-web 开发高性能 Web 服务
  • 网站编辑怎么做内容分类网络营销是做什么的
  • C++ STL:string(2) |Capacity|Modifiers|operations|OJ练习
  • 一个网站的二维码怎么做国外免费源码共享网站
  • YOLOv5:实时目标检测的现代化实践与深度解析
  • 丰城网站建设公司泰安正规网站建设公司电话
  • 弹簧机 东莞网站建设成都大型网站设计公司
  • 做简历的什么客网站i5 7500网站开发
  • 遵义网站网站建设珠海做网站哪家最专业
  • 成都航空公司官方网站wordpress 浮动小人
  • 掌握 Cursor:AI辅助开发战略指南
  • Github仓库上传图片并获取URL
  • 如何弄一个网站天美影视传媒有限公司
  • 企业管理官网登录入口南阳做网站优化公司
  • C++容器map
  • 【下载】电视家TV极速版功能介绍下载,免费看
  • 命令真值表(Command Truth Table)
  • 使用现代新硬件安装 Windows 7 的特别注意事项
  • 实验一:基于MATLAB控制系统单位阶跃响应分析
  • 优势网网站视频推广渠道有哪些
  • 2025智能体发展已经进入第3阶段了?企业发展Agent需要注意哪些核心竞争力?
  • 将有序数组转换为二叉搜索树-力扣
  • 【推荐100个unity插件】在unity快速生成3D人物自然姿势和动作,且支持按图像生成姿势—— Pose AI
  • 深圳制作网站制作dedecms 调用wordpress
  • 珠海网站推广价格外贸剪标大衣正品女款