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

SpringBoot整合RabbitMQ及原理

 更新時間:2023年06月27日 11:32:32   作者:LoneWalker、  
這篇文章主要介紹了SpringBoot整合RabbitMQ及其原理分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

上一篇:RabbitMQ基礎知識

1、相關依賴

這里無需指定版本號,讓其跟著SpringBoot版本走。本示例使用SpringBoot版本號為2.7.10。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

2、生產(chǎn)者、消費者

創(chuàng)建兩個SpringBoot應用,模擬消息生產(chǎn)者與消費者【publisher、consumer】。

2-1生產(chǎn)者

編寫配置文件,用戶名和密碼等自行修改 這里虛擬機的名稱是上一篇文章中新建的。

server.port=8082
#rabbitmq服務器ip
spring.rabbitmq.host=localhost
#rabbitmq的端口
spring.rabbitmq.port=5672
#用戶名
spring.rabbitmq.username=用戶名
#密碼
spring.rabbitmq.password=密碼
#配置虛擬機
spring.rabbitmq.virtual-host=demo

聲明交換機、隊列并綁定:

@Configuration
public class RabbitMqConfig {
    @Bean
    public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
    @Bean
    public MessageConverter jackson2JsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
    @Bean
    public DirectExchange getExchange(){
        return new DirectExchange("directExchange",false,false);
    }
    @Bean
    public Queue getQueue(){
        return new Queue("publisher.addUser",true,false,false);
    }
    @Bean
    public Binding getBinding(DirectExchange exchange,Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("publisher.addUser");
    }
}

新建User實體類

@Data
public class User {
    private Long id;
    private String name;
    private String desc;
}

在方法中使用RabbitTemplate來發(fā)送消息:

public interface PublisherService {
    /**
     * 添加用戶
     * @param user 用戶信息
     */
    void addUser(User user);
}
@RequiredArgsConstructor
@Service
public class PublisherServiceImpl implements PublisherService{
    private final RabbitTemplate rabbitTemplate;
    @Override
    public void addUser(User user) {
        rabbitTemplate.convertAndSend("directExchange","publisher.addUser",user);
    }
}

以上需要注意的就是交換機的名稱、隊列名、routingKey。示例中使用的是直連交換機,routingKey需要和隊列名保持一致。不懂的可以查看上一篇文章。

controller:

@RequiredArgsConstructor
@RestController
@RequestMapping("/user")
public class UserController {
    private final PublisherService publisherService;
    @PostMapping("/add")
    public void add(){
        User user = new User();
        user.setId(1000L);
        user.setName("黃忠");
        user.setDesc("老兵不死,只是逐漸凋零");
        publisherService.addUser(user);
    }
}

2-2消費者

消費者的配置和生產(chǎn)者一樣,不贅述了,直接看代碼:

@Service
@Slf4j
public class ConsumerService {
    @RabbitListener(queues ="publisher.addUser")
    public void addUser(String userStr){
        User user = JSONObject.parseObject(userStr,User.class);
        log.info(user.toString());
    }
}

@RabbitListener 注解是指定某方法作為消息消費的方法,指定隊列名稱。@RabbitListener 如果標注在類上,需配合 @RabbitHandler 注解一起使用,根據(jù)接受的參數(shù)類型進入具體的方法中。

2-3測試

消費端在啟動時可能會報找不到交換機或隊列,只需要讓生產(chǎn)者發(fā)送一次消息,從控制臺就可以看到相關的交換機和隊列等信息了。

可以看到消費者成功消費了消息:

3、消費流程

通過上述操作,我們已經(jīng)會簡單地使用RabbitMQ了,接下來了解一下它的整個流程。如此可以讓我們掌握的更牢固。

生產(chǎn)者:

  • 生產(chǎn)者連接到Message Broker【也就是RabbitMQ服務】,建立一個連接( Connection)開啟一個信道(Channel)。
  • 生產(chǎn)者聲明一個交換機,并設置相關屬性,比如交換機類型、是否持久化等。
  • 生產(chǎn)者聲明一個隊列并設置相關屬性。
  • 生產(chǎn)者通過路由鍵【Routing Key】將交換機和隊列綁定。
  • 生產(chǎn)者發(fā)送消息至RabbitMQ Broker,其中包含路由鍵、交換器等信息。
  • 相應的交換機根據(jù)接收到的路由鍵查找相匹配的隊列。
  • 如果找到,則將從生產(chǎn)者發(fā)送過來的消息存入相應的隊列中。
  • 如果沒有找到,則根據(jù)生產(chǎn)者配置的屬性選擇丟棄還是回退給生產(chǎn)者
  • 關閉信道。
  • 關閉連接。

消費者:

  • 消費者連接到RabbitMQ Broker ,建立一個連接(Connection),開啟一個信道(Channel) 。
  • 消費者向RabbitMQ Broker 請求消費相應隊列中的消息,可能會設置相應的回調(diào)函數(shù),
  • 等待RabbitMQ Broker 回應并投遞相應隊列中的消息,消費者接收消息。
  • 消費者確認(ack) 接收到的消息。
  • RabbitMQ 從隊列中刪除相應己經(jīng)被確認的消息。
  • 關閉信道。
  • 關閉連接。

到此這篇關于SpringBoot整合RabbitMQ及其原理分析的文章就介紹到這了,更多相關SpringBoot整合RabbitMQ內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring如何使用AOP實現(xiàn)聲明式事務管理

    Spring如何使用AOP實現(xiàn)聲明式事務管理

    Spring?使用?AOP?實現(xiàn)聲明式事務管理是其最強大的功能之一,這篇文章小編將詳細拆解這個過程,從高層概念到底層原理,感興趣的小伙伴可以參考一下
    2025-06-06
  • SpringBoot使用Scheduling實現(xiàn)定時任務的示例代碼

    SpringBoot使用Scheduling實現(xiàn)定時任務的示例代碼

    Spring Boot提供了一種方便的方式來實現(xiàn)定時任務,即使用Spring的@Scheduled注解,通過在方法上添加@Scheduled注解,我們可以指定方法在何時執(zhí)行,本文我們就給大家介紹一下SpringBoot如何使用Scheduling實現(xiàn)定時任務,需要的朋友可以參考下
    2023-08-08
  • Springboot shiro認證授權實現(xiàn)原理及實例

    Springboot shiro認證授權實現(xiàn)原理及實例

    這篇文章主要介紹了Springboot shiro認證授權實現(xiàn)原理及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 解決idea?中?SpringBoot?點擊運行沒反應按鈕成灰色的問題

    解決idea?中?SpringBoot?點擊運行沒反應按鈕成灰色的問題

    在使用 Spring Boot 開發(fā)項目時,可能會遇到一個問題:點擊運行按鈕后,控制臺沒有任何輸出,項目界面也沒有顯示,這種情況可能是由多種原因?qū)е碌?,本文將介紹一些常見的解決方法,需要的朋友可以參考下
    2023-08-08
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法

    java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list

    這篇文章主要介紹了java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法的相關資料,需要的朋友可以參考下
    2016-12-12
  • Spring MVC使用視圖解析的問題解讀

    Spring MVC使用視圖解析的問題解讀

    這篇文章主要介紹了Spring MVC使用視圖解析的問題解讀,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • RecyclerChart動態(tài)屬性圖標聯(lián)動數(shù)據(jù)動態(tài)加載詳解

    RecyclerChart動態(tài)屬性圖標聯(lián)動數(shù)據(jù)動態(tài)加載詳解

    這篇文章主要為大家介紹了RecyclerChart動態(tài)屬性圖標聯(lián)動數(shù)據(jù)動態(tài)加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 深入理解ThreadLocal工作原理及使用示例

    深入理解ThreadLocal工作原理及使用示例

    這篇文章主要介紹了深入理解ThreadLocal工作原理及使用示例,涉及ThreadLocal<T> 簡介和使用示例及ThreadLocal<T>的原理等相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • java通過Callable和Future來接收線程池的執(zhí)行結果

    java通過Callable和Future來接收線程池的執(zhí)行結果

    這篇文章主要介紹了java通過Callable和Future來接收線程池的執(zhí)行結果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 在JAVA?Web項目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項目中,我們經(jīng)常需要調(diào)用一些第三方庫或者實現(xiàn)一些JAVA本身不支持的功能,這時,我們可能會考慮使用JNI來調(diào)用DLL或SO文件,然而,因此,本文將介紹如何在JAVA?Web項目中動態(tài)加載DLL/SO文件,需要的朋友可以參考下
    2024-12-12

最新評論

年辖:市辖区| 疏附县| 苏尼特左旗| 抚顺县| 仁化县| 灵台县| 长海县| 昌江| 北票市| 大渡口区| 五寨县| 延庆县| 黑山县| 南投市| 汕头市| 南宁市| 长顺县| 略阳县| 台中市| 宁强县| 宁远县| 祁阳县| 黔南| 中西区| 吉木萨尔县| 岳普湖县| 惠来县| 永和县| 三都| 万盛区| 石家庄市| 肥乡县| 宁明县| 汶上县| 灵山县| 通许县| 彩票| 泸州市| 宁津县| 井研县| 浑源县|