使用Spring Context實現(xiàn)消息隊列的示例代碼
本文介紹如何使用 Spring Context 實現(xiàn)消息隊列
實現(xiàn)
定義一個消息對象,如下:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 消息對象
*/
@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);
}
}
消息消費者,接收消息,并轉(zhuǎn)發(fā)到指定實現(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;
/**
* 消息消費著
*/
@Slf4j
@Component
public class MyConsumer {
@Resource
private DemoService demoService;
@EventListener
@Async // Spring Event 默認(rèn)在 Producer 發(fā)送的線程,通過 @Async 實現(xiàn)異步
public void onMessage(MyMessage message) {
log.info("[onMessage][消息內(nèi)容({})]", 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 消息
*/
@Override
public 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 {
@Resource
private MyProducer myProducer;
@PostMapping("/put")
private void test(@RequestBody MyMessage myMessage) {
myProducer.sendMyMessage(myMessage.getMessageId(), myMessage.getMessage());
}
}
以上代碼,pom.xml 如下,功能實現(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>
啟動,調(diào)用該接口

控制臺可見消息被消費

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

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

總結(jié)
到此這篇關(guān)于使用Spring Context實現(xiàn)消息隊列的示例代碼的文章就介紹到這了,更多相關(guān)Spring Context消息隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot獲得Maven-pom中版本號和編譯時間戳
這篇文章主要介紹了詳解SpringBoot獲得Maven-pom中版本號和編譯時間戳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
使用JPA+querydsl如何實現(xiàn)多條件動態(tài)查詢
這篇文章主要介紹了使用JPA+querydsl如何實現(xiàn)多條件動態(tài)查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
關(guān)于注解FeignClient的使用規(guī)范
這篇文章主要介紹了關(guān)于注解FeignClient的使用規(guī)范,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Javaweb監(jiān)聽器實例之統(tǒng)計在線人數(shù)
這篇文章主要為大家詳細(xì)介紹了Javaweb監(jiān)聽器實例之統(tǒng)計在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11

