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

SpringBoot+RabbitMQ完成應(yīng)用通信

 更新時間:2025年06月12日 08:35:11   作者:新綠MEHO  
本文主要介紹了SpringBoot+RabbitMQ完成應(yīng)用通信,通過訂單系統(tǒng)發(fā)送訂單消息并通知物流系統(tǒng)消費,解決了對象類型消息的序列化問題,感興趣的可以了解一下

應(yīng)用通信

作為?個消息隊列, RabbitMQ也可以?作應(yīng)?程序之間的通信. 上述代碼?產(chǎn)者和消費者代碼放在不同的應(yīng)?中即可完成不同應(yīng)?程序的通信.
接下來我們來看, 基于SpringBoot+RabbitMQ完成應(yīng)?間的通信.

需求描述

??下單成功之后, 通知物流系統(tǒng), 進?發(fā)貨。

訂單系統(tǒng)作為?個?產(chǎn)者, 物流系統(tǒng)作為?個消費者。

創(chuàng)建項目

創(chuàng)建空項目

創(chuàng)建Module(order-service)

添加依賴

創(chuàng)建Module(logistics-service)

添加依賴

消息類型為字符串

編寫訂單代碼

添加配置

spring:
  application:
    name: order-service
  rabbitmq:
    addresses: amqp://study:study@47.98.109.138:5672/order

聲明隊列

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    @Bean("orderQueue")
    public Queue orderQueue() {
        return QueueBuilder.durable("order.create").build();
    }
}

生產(chǎn)訂單

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;
import java.util.UUID;

@RequestMapping("/order")
@RestController
public class OrderController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RequestMapping("create")
    public String create(){
        String orderId= UUID.randomUUID().toString();
        rabbitTemplate.convertAndSend("","order.create","訂單信息,訂單ID:"+orderId);
        return "下單成功";
    }
}

編寫物流代碼

添加配置

spring:
  application:
    name: logistics-service
  rabbitmq:
    addresses: amqp://study:study@47.98.109.138:5672/order
server:
  port: 9090

聲明隊列

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitMQConfig {
    @Bean("order.create")
    public Queue createOrder() {
        return QueueBuilder.durable("order.create").build();
    }
}

消費訂單

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class OrderListener {
    @RabbitListener(queues = "order.create")
    public void handMessage(String orderInfo) {
        System.out.println("接收到訂單消息"+orderInfo);
    }
}

生產(chǎn)訂單

消費訂單

可以看到,訂單已經(jīng)被成功消費了,結(jié)果符合預(yù)期。 

消息類型為對象

下面的代碼是以上面代碼的基礎(chǔ),并進行增添刪除編寫而成的。

新增Module

因為訂單系統(tǒng)和物流系統(tǒng)在生產(chǎn)和消費對象類型的消息時,會用到同一個結(jié)構(gòu)體,為了便于代碼編寫,新增Module,把OrderInfo放到新增的Module中。

import lombok.Data;


@Data
public class OrderInfo{
    private String orderId;
    private String name;
}

編寫訂單代碼

在order-service項目的OrderController中添加如下代碼:

    @RequestMapping("create2")
    public String create2(){
        OrderInfo orderInfo=new OrderInfo();
        orderInfo.setOrderId(UUID.randomUUID().toString());
        orderInfo.setName("商品"+new Random().nextInt(100));
        rabbitTemplate.convertAndSend("","order.create",orderInfo);
        return "下單成功";
    }

生產(chǎn)對象類型訂單消息

此時我們發(fā)現(xiàn)拋異常了,異常信息為SimpleMessageConverter只支持String, byte[] and Serializable類型的payloads,但是接收到的是order.model.OrderInfo對象。

解決辦法1(實現(xiàn)序列化接口)

修改order-service下的OrderInfo類

import lombok.Data;

import java.io.Serializable;

@Data
public class OrderInfo implements Serializable {
    private String orderId;
    private String name;
}

雖然成功生成了對象類型的訂單消息,但是我們看到消息的Payload并不直觀,下面我們將采用兩一種解決辦法。

解決辦法2(設(shè)置消息轉(zhuǎn)換類型)

修改order-service中的OrderInfo

import lombok.Data;

@Data
public class OrderInfo{
    private String orderId;
    private String name;
}

查看RabbitTemplated的setMessageConverter方法,查看MessageConverter接口的實現(xiàn)類,我們將使用Jackson2JsonMessageConverter。

修改order-service中的RabbitMQConfig

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    @Bean("orderQueue")
    public Queue orderQueue() {
        return QueueBuilder.durable("order.create").build();
    }

    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory, Jackson2JsonMessageConverter jsonMessageConverter){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(factory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter);
        return rabbitTemplate;
    }
}

再次生產(chǎn)對象類型訂單消息

此時再次查看隊列中的消息,我們可以看到消息的Payload是非常直觀的!??!

編寫物流代碼

修改logistics-service中的代碼

import logistics.model.OrderInfo;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "order.create")
public class OrderListener {
    public void handMessage(String orderInfo) {
        System.out.println("接收到訂單消息"+orderInfo);
    }

    public void handMessage(OrderInfo orderInfo) {
        System.out.println("接收到訂單消息"+orderInfo);
    }
}

消費對象類型訂單消息

但是過了許久,我們也沒有看到隊列中的消息被消費?。?!

解決辦法

原因是因為@RabbitListener(queues = "order.create")注解聲明在類上面時,須結(jié)合@RabbitHandler注解來使用?。?!

修改logistics-service中的代碼

import logistics.model.OrderInfo;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "order.create")
public class OrderListener {
    @RabbitHandler
    public void handMessage(String orderInfo) {
        System.out.println("接收到訂單消息"+orderInfo);
    }

    @RabbitHandler
    public void handMessage(OrderInfo orderInfo) {
        System.out.println("接收到訂單消息"+orderInfo);
    }
}

此時消費消息,但是發(fā)現(xiàn)又拋異常了

原因是因為,我們的確是針對生產(chǎn)對象類型消息的一方設(shè)置了MessageConverter,但是我們沒有給消費對象類型消息的一方設(shè)置MessageConverter,導(dǎo)致消費對象類型消息的一方?jīng)]有辦法正確解析出消息。

解決辦法,依舊是添加MessageConverter?。?!

修改logistics-service中的RabbitMQConfig

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitMQConfig {
    @Bean("order.create")
    public Queue createOrder() {
        return QueueBuilder.durable("order.create").build();
    }

    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory, Jackson2JsonMessageConverter jsonMessageConverter){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(factory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter);
        return rabbitTemplate;
    }
}

再次消費消息 

此時我們可以看到,對象類型的訂單消息可以正常消費了,符合預(yù)期。

到此這篇關(guān)于SpringBoot+RabbitMQ完成應(yīng)用通信的文章就介紹到這了,更多相關(guān)SpringBoot RabbitMQ通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Lombok的坑

    詳解Lombok的坑

    這篇文章主要介紹了詳解Lombok的坑,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(條件隊列)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(條件隊列)

    這篇文章主要為大家詳細介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 實例解析JAVA中代碼的加載順序

    實例解析JAVA中代碼的加載順序

    這篇文章主要介紹了舉例說明Java中代碼塊的執(zhí)行順序,需要的朋友可以參考下
    2017-04-04
  • IDEA SpringBoot:Cannot resolve configuration property配置文件問題

    IDEA SpringBoot:Cannot resolve configuration&

    這篇文章主要介紹了IDEA SpringBoot:Cannot resolve configuration property配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8圖文教程

    Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8圖文教程

    CentOS系統(tǒng)是開發(fā)者常用的Linux操作系統(tǒng),安裝它時會默認安裝自帶的舊版本的OpenJDK,但在開發(fā)者平時開發(fā)Java項目時還是需要完整的JDK,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • java獲取文件編碼,jsoup獲取html純文本操作

    java獲取文件編碼,jsoup獲取html純文本操作

    這篇文章主要介紹了java獲取文件編碼,jsoup獲取html純文本操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JAVA項目字典與緩存搭配使用方法解析

    JAVA項目字典與緩存搭配使用方法解析

    這篇文章主要介紹了JAVA項目字典與緩存搭配使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Java中的Set、List、Map的用法與區(qū)別介紹

    Java中的Set、List、Map的用法與區(qū)別介紹

    這篇文章主要介紹了Java中的Set、List、Map的用法與區(qū)別,需要的朋友可以參考下
    2016-06-06
  • CentOS7和8中安裝Maven3.8.4的簡單步驟

    CentOS7和8中安裝Maven3.8.4的簡單步驟

    maven是屬于apache的一個工具,主要是對java進行編譯打包,解決依賴關(guān)系,下面這篇文章主要給大家介紹了關(guān)于CentOS7和8中安裝Maven3.8.4的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • java字符串壓縮解壓示例

    java字符串壓縮解壓示例

    這篇文章主要介紹了java字符串壓縮解壓示例,先壓縮,再加密,再壓縮,數(shù)據(jù)越大,壓縮比例越高,需要的朋友可以參考下
    2014-03-03

最新評論

塘沽区| 东莞市| 敦化市| 漾濞| 任丘市| 射阳县| 宜黄县| 诏安县| 神农架林区| 富宁县| 于田县| 永宁县| 云南省| 延津县| 临清市| 山阴县| 宁明县| 东辽县| 德钦县| 金华市| 鸡泽县| 新郑市| 河曲县| 冕宁县| 射阳县| 资中县| 历史| 崇义县| 财经| 石城县| 龙川县| 鄯善县| 井研县| 绿春县| 临猗县| 浦江县| 桃江县| 长宁县| 精河县| 赞皇县| 巢湖市|