最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring Context實(shí)現(xiàn)消息隊(duì)列的示例代碼

 更新時(shí)間:2025年10月28日 09:08:22   作者:何中應(yīng)  
在現(xiàn)代分布式系統(tǒng)中,消息隊(duì)列是一個(gè)非常重要的組件,它可以解耦系統(tǒng)的各個(gè)部分,提高系統(tǒng)的可伸縮性和可靠性,本文將詳細(xì)介紹如何使用Spring Boot實(shí)現(xiàn)消息隊(duì)列,包括消息的發(fā)送和接收,需要的朋友可以參考下

本文介紹如何使用 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)文章

  • 使用javafx更新UI的方法

    使用javafx更新UI的方法

    這篇文章主要介紹了使用javafx更新UI的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解SpringBoot獲得Maven-pom中版本號(hào)和編譯時(shí)間戳

    詳解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)

    這篇文章主要介紹了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)查詢

    這篇文章主要介紹了使用JPA+querydsl如何實(shí)現(xiàn)多條件動(dòng)態(tài)查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 關(guān)于注解FeignClient的使用規(guī)范

    關(guān)于注解FeignClient的使用規(guī)范

    這篇文章主要介紹了關(guān)于注解FeignClient的使用規(guī)范,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springBoot2.6.2自動(dòng)裝配之注解源碼解析

    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ù)

    Javaweb監(jiān)聽器實(shí)例之統(tǒng)計(jì)在線人數(shù)

    這篇文章主要為大家詳細(xì)介紹了Javaweb監(jiān)聽器實(shí)例之統(tǒng)計(jì)在線人數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • idea手動(dòng)刷新git分支的詳細(xì)教程

    idea手動(dòng)刷新git分支的詳細(xì)教程

    這篇文章主要介紹了idea手動(dòng)刷新git分支,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java17新特性之Text Blocks文本塊的使用

    Java17新特性之Text Blocks文本塊的使用

    Java 17引入了Text Blocks(文本塊)特性,這是Java語言中一種新的字符串表示方式,本文就來詳細(xì)的介紹一下文本塊的使用,感興趣的可以了解一下
    2025-10-10
  • SpringBoot和Tomcat的關(guān)系解讀

    SpringBoot和Tomcat的關(guān)系解讀

    這篇文章主要介紹了SpringBoot和Tomcat的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評(píng)論

陇川县| 宜君县| 怀安县| 象州县| 甘孜| 枣庄市| 光泽县| 聂拉木县| 鄂尔多斯市| 大同市| 罗定市| 定远县| 老河口市| 永吉县| 新竹市| 收藏| 合肥市| 浠水县| 五原县| 铜鼓县| 凤阳县| 子洲县| 武陟县| 米易县| 乾安县| 奉节县| 新龙县| 通城县| 华蓥市| 朝阳区| 晴隆县| 满洲里市| 桐柏县| 临夏县| 文昌市| 北宁市| 类乌齐县| 新乡市| 大厂| 宜州市| 庆阳市|