使用Spring Context實(shí)現(xiàn)消息隊(duì)列的示例代碼
本文介紹如何使用 Spring Context 實(shí)現(xiàn)消息隊(duì)列
實(shí)現(xiàn)
定義一個(gè)消息對(duì)象,如下:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 消息對(duì)象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyMessage {
private String messageId;
private String message;
}
消息生產(chǎn)者,使用 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;
/**
* 消息生產(chǎn)者
*/
@Slf4j
@Component
public class MyProducer {
@Resource
private ApplicationContext applicationContext;
public void sendMyMessage(String messageId, String message) {
MyMessage myMessage = new MyMessage(messageId, message);
applicationContext.publishEvent(myMessage);
}
}
消息消費(fèi)者,接收消息,并轉(zhuǎn)發(fā)到指定實(shí)現(xiàn)類執(zhí)行
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;
/**
* 消息消費(fèi)著
*/
@Slf4j
@Component
public class MyConsumer {
@Resource
private DemoService demoService;
@EventListener
@Async // Spring Event 默認(rèn)在 Producer 發(fā)送的線程,通過 @Async 實(shí)現(xiàn)異步
public void onMessage(MyMessage message) {
log.info("[onMessage][消息內(nèi)容({})]", message);
demoService.doMyMessage(message);
}
}
消費(fèi)方法
import com.hezy.service.mq.message.MyMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class DemoServiceImpl implements DemoService {
/**
* 消息消費(fèi)方法
*
* @param message 消息
*/
@Override
public void doMyMessage(MyMessage message) {
log.info("收到消息:{}, 去做一些事情", message);
}
}
寫一個(gè)接口,推送消息
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 {
@Resource
private MyProducer myProducer;
@PostMapping("/put")
private void test(@RequestBody MyMessage myMessage) {
myProducer.sendMyMessage(myMessage.getMessageId(), myMessage.getMessage());
}
}
以上代碼,pom.xml 如下,功能實(shí)現(xiàn)僅使用了 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>
啟動(dòng),調(diào)用該接口

控制臺(tái)可見消息被消費(fèi)

另外
推送消息是異步操作,如下,在推送消息后線程休眠10秒,消息也會(huì)在接口返回結(jié)果之前被消費(fèi)。
@PostMapping("/put")
private void test(@RequestBody MyMessage myMessage) throws InterruptedException {
myProducer.sendMyMessage(myMessage.getMessageId(), myMessage.getMessage());
Thread.sleep(10000L);
System.out.println("返回結(jié)果");
}

消息推送給消費(fèi)者,是通過消息對(duì)象來識(shí)別的,只要消息消費(fèi)者的參數(shù)是消息對(duì)象,就能接收到該消息。
如果定義了多個(gè)消費(fèi)者,參數(shù)是同一個(gè)消息對(duì)象,這些消費(fèi)者都能接收到該消息,是廣播的方式,如下:

總結(jié)
到此這篇關(guān)于使用Spring Context實(shí)現(xiàn)消息隊(duì)列的示例代碼的文章就介紹到這了,更多相關(guān)Spring Context消息隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot獲得Maven-pom中版本號(hào)和編譯時(shí)間戳
這篇文章主要介紹了詳解SpringBoot獲得Maven-pom中版本號(hào)和編譯時(shí)間戳,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)
這篇文章主要介紹了Java輸出鏈表倒數(shù)第k個(gè)節(jié)點(diǎn)的相關(guān)內(nèi)容,涉及三種設(shè)計(jì)思路及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
使用JPA+querydsl如何實(shí)現(xiàn)多條件動(dòng)態(tài)查詢
這篇文章主要介紹了使用JPA+querydsl如何實(shí)現(xiàn)多條件動(dòng)態(tài)查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
關(guān)于注解FeignClient的使用規(guī)范
這篇文章主要介紹了關(guān)于注解FeignClient的使用規(guī)范,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
springBoot2.6.2自動(dòng)裝配之注解源碼解析
對(duì)于springboot個(gè)人認(rèn)為它就是整合了各種組件,然后提供對(duì)應(yīng)的自動(dòng)裝配和啟動(dòng)器(starter),基于這個(gè)流程去實(shí)現(xiàn)一個(gè)定義的裝配組件,下面這篇文章主要給大家介紹了關(guān)于springBoot2.6.2自動(dòng)裝配之注解源碼解析的相關(guān)資料,需要的朋友可以參考下2022-01-01
Javaweb監(jiān)聽器實(shí)例之統(tǒng)計(jì)在線人數(shù)
這篇文章主要為大家詳細(xì)介紹了Javaweb監(jiān)聽器實(shí)例之統(tǒng)計(jì)在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

