中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot怎么整合RabbitMQ消息隊列

發布時間:2022-08-17 16:41:32 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

這篇文章主要介紹“Springboot怎么整合RabbitMQ消息隊列”,在日常操作中,相信很多人在Springboot怎么整合RabbitMQ消息隊列問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Springboot怎么整合RabbitMQ消息隊列”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    生產者工程

    POM依賴

    可以在創建工程時直接選擇添加依賴。

    Springboot怎么整合RabbitMQ消息隊列

    Springboot怎么整合RabbitMQ消息隊列

    application文件

    因為rabbitmq具有默認地址及用戶信息,所以如果是本地rabbitmq可以不需要進行配置。

    Springboot怎么整合RabbitMQ消息隊列

    Springboot怎么整合RabbitMQ消息隊列

    RabbitMQ配置文件:

    在使用相關交換機及隊列時,我們需要實現聲明交換機及隊列,如果沒有對應信息,則啟動項目會失敗。所以在使用springboot整合rabbitmq時,我們可以通過配置文件來進行交換機、隊列的聲明及二者之間的關系綁定。 由于目前在演示Fanout模式,所以使用FanoutExchange來聲明交換機,其他模式則使用相對應的TopicExchange,DirectExchange來聲明。

    @Configuration
    public class RabbitMQConfiguration {
    
    //聲明fanout模式的交換機
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout_order_exchange", true, false);
    }
    
    //聲明隊列
    @Bean
    public Queue smsQueue() {
        return new Queue("sms.fanout.queue", true);
    }
    
    @Bean
    public Queue emailQueue() {
        return new Queue("email.fanout.queue", true);
    }
    
    @Bean
    public Queue duanxinQueue() {
        return new Queue("duanxin.fanout.queue", true);
    }
    //綁定
    
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }
    
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }
    
    @Bean
    public Binding duanxinBinding() {
        return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
    }
    }
    生產者業務代碼

    這部分代碼就簡單的通過調用rabbitTemplate來進行消息的分發。@Service public class OrderService {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void makeOrder() {
        // 保存訂單
        String orderId = UUID.randomUUID().toString();
        System.out.println("下單成功:" + orderId);
        // 通過MQ完成消息的分發
        // 參數1:交換機 ;參數2:路由key/隊列名;參數3:消息內容
        String exchangeName = "fanout_order_exchange";
        rabbitTemplate.convertAndSend(exchangeName, "", orderId);
    }
    }

    消費者:

    消費者工程和生產者工程類似,我們首先需要引入依賴,然后在application文件中進行相關的配置即可開始編寫代碼。 在消費者工程中我們也可以編寫rabbitmq的配置文件來進行交換機及隊列的聲明。建議在消費端編寫配置文件,因為消費端是先啟動的工程,如果交換機和隊列未創建會導致工程啟動失敗。 消息監聽

    我們通過RabbitListener注解來監聽消息隊列。需要注意的是我們需要通過Component注解將該監聽交給spring管理,否則不能正常接收服務端的消息。 這邊只給出一個email的消息監聽,上文生產者聲明的duanxin,sms隊列可以自行創建,只需要修改隊列名即可。@Service public class OrderService {

    @RabbitListener(queues = {"email.fanout.queue"})
    @Component
    public class FanoutEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email fanout -----》接收到" + message);
        }
    }

    測試

    首先啟動消費者工程,然后在生產者工程中創建測試類發送消息即可。

    @SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests {
    
    @Autowired
    private OrderService orderService;
    
    @Test
    void contextLoads() {
        orderService.makeOrder();
    }
    }

    當發送消息后,我們可以在控制臺中發現消費者成功接受消息。

    Springboot怎么整合RabbitMQ消息隊列

    Direct 模式

    生產者

    建立工程的步驟和上文相同。

    配置文件

    配置和上文基本相同,由于該部分測試direct模式,所以需要使用DirectExchange創建交換機。需要注意的是該類中的方法名不能和上文rabbitmq的配置文件中的方法名相同,因為我們使用bean注解將其交給spring管理,如果名字相同,則會啟動項目失敗。

    @Configuration
    public class DirectRabbitMQConfiguration {
    
    //聲明direct模式的交換機
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct_order_exchange", true, false);
    }
    
    //聲明隊列
    @Bean
    public Queue smsDirectQueue() {
        return new Queue("sms.direct.queue", true);
    }
    
    @Bean
    public Queue emailDirectQueue() {
        return new Queue("email.direct.queue", true);
    }
    
    @Bean
    public Queue duanxinDirectQueue() {
        return new Queue("duanxin.direct.queue", true);
    }
    //綁定
    
    @Bean
    public Binding smsDirectBinding() {
        return BindingBuilder.bind(smsDirectQueue()).to(directExchange()).with("sms");
    }
    
    @Bean
    public Binding emailDirectBinding() {
        return BindingBuilder.bind(emailDirectQueue()).to(directExchange()).with("email");
    }
    
    @Bean
    public Binding duanxinDirectBinding() {
        return BindingBuilder.bind(duanxinDirectQueue()).to(directExchange()).with("duanxin");
    }
    }

    業務代碼

    @Service
    public class OrderService {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        public void makeOrderDirect() {
            // 保存訂單
            String orderId = UUID.randomUUID().toString();
            System.out.println("下單成功:" + orderId);
            String exchangeName = "direct_order_exchange";
            rabbitTemplate.convertAndSend(exchangeName, "sms", orderId);
            rabbitTemplate.convertAndSend(exchangeName, "email", orderId);
        }
    
    }

    消費者

    消息監聽

    和上文相同,只需注意隊列名即可。

    @RabbitListener(queues = {"email.direct.queue"})
    @Component
    public class DirectEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email direct -----》接收到" + message);
        }
    }

    Topic 模式

    上文中個模式都是通過配置文件來聲明交換機,隊列及綁定二者之間的關系;實際上我們還可以通過注解的方式來聲明交換機及注解。

    生產者

    由于使用注解方式聲明,所以我們不需要創建配置文件,直接編寫業務代碼即可。測試的時候我們只需修改路由名即可,具體如何修改,請前往文章開頭鏈接查看各模式是如何使用的。

    @Service
    public class OrderService {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void makeOrderTopic() {
        // 保存訂單
        String orderId = UUID.randomUUID().toString();
        System.out.println("下單成功:" + orderId);
        String exchangeName = "topic_order_exchange";
        String routingKey = "com.email";
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId);
    }
    }

    消費者

    代碼和上文基本相同,區別在于我們直接在RabbitListener注解中將隊列和交換機進行綁定。需要注意的是各參數中都是使用字符串。 value對應的是隊列,相應的參數分別是隊列名、持久化、自動刪除。 exchange對應的交換機,相應的參數分別是交換機名以及交換機類型。 key對應的是路由名。

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "email.topic.queue",durable = "true",autoDelete = "false"),
            exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
            key = "*.email.#"
    ))
    @Component
    public class TopicEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email topic -----》接收到" + message);
        }
    }

    到此,關于“Springboot怎么整合RabbitMQ消息隊列”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    建德市| 宜丰县| 河北区| 马山县| 米脂县| 那曲县| 怀安县| 大关县| 商丘市| 陇南市| 宝清县| 开阳县| 普洱| 东明县| 海晏县| 南陵县| 屏山县| 肃南| 吉安县| 亚东县| 瓦房店市| 镇赉县| 盐源县| 夹江县| 玉田县| 阿克| 小金县| 眉山市| 双鸭山市| 长岭县| 舒兰市| 白朗县| 揭西县| 大连市| 郸城县| 紫阳县| 朝阳县| 秭归县| 叶城县| 海门市| 苍南县|