Heim  >  Artikel  >  Java  >  So implementieren Sie den Direktantwortmodus für Springboot RabbitMQ-Antwortnachrichten

So implementieren Sie den Direktantwortmodus für Springboot RabbitMQ-Antwortnachrichten

王林
王林nach vorne
2023-05-11 11:58:141438Durchsuche

1. Nutzungsszenarien

Zu den Funktionen von MQ gehören Entkopplung, Asynchronität usw.

Normalerweise sind Produzenten nur für die Erstellung von Nachrichten verantwortlich und kümmern sich nicht darum, wer die Nachrichten erhält oder was die Konsumergebnisse sind; Verbraucher sind nur für den Empfang bestimmter Nachrichten für die Geschäftsverarbeitung verantwortlich und kümmern sich nicht darum, woher die Nachrichten kommen und auf das Unternehmen reagieren Bearbeitungsstand. In unserem Projekt gibt es jedoch ein besonderes Geschäft. Als Nachrichtenproduzent müssen wir das Antwortergebnis des Verbrauchers nach der Erstellung der Nachricht erhalten (um es ganz klar auszudrücken: Es ähnelt der Verwendung einer synchronen Anrufanforderungsantwort durch MQ). Für dieses Geschäftsmodell wurde der Antwortmodus (Direktantwortmodell) von MQ entwickelt.

2. Antwort in Aktion

(1) Abhängigkeiten und YML-Konfiguration

Abhängigkeiten:

Ich liste nur die für RabbitMq erforderlichen Kernabhängigkeiten auf

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

Konfiguration:

Keine andere spezielle Konfiguration, da die Antwort lautet nur eine interaktive Methode von RabbitMq

spring:
  rabbitmq:
    host: 10.50.40.116
    port: 5673
    username: admin
    password: admin

(2) RabbitMq-Bean-Konfiguration

package com.leilei.demo;

import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author lei
 * @create 2022-09-19 21:44
 * @desc mq配置
 **/
@Configuration
public class RabbitMqConfig {
    @Bean
    public Queue bizQueue() {
        return new Queue("bizQueue");
    }
    @Bean
    public Queue replyQueue() {
        return new Queue("replyQueue");
    }
    @Bean
    FanoutExchange bizExchange() {
        return new FanoutExchange("bizExchange");
    }
}

Business-Klasse:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Vehicle implements Serializable {
    private Integer id;
    private String name;
}

(3) Ende der Nachrichtenproduktion

Dinge, die das Ende der Nachrichtenproduktion tun muss: Nachrichten produzieren und diese akzeptieren Nachricht Verbrauchsantwort

(1) Nachricht erstellen

  • 1. Wählen Sie je nach Geschäftsszenario aus, ob eine global eindeutige benutzerdefinierte Nachrichten-ID generiert werden soll

  • 2. Geben Sie die Warteschlange für die Antwort nach dem Nachrichtenverbrauch an (Antwort)

    /**
     * 生产消息
     *
     * @param
     * @return void
     * @author lei
     * @date 2022-09-19 21:59:18
     */
    public void replySend() {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setReplyTo("replyQueue");
        //todo 根据业务,做一个严谨的全局唯一ID,我这里暂时用UUID
        String correlationId = UUID.randomUUID().toString();
        // 我这里指定了唯一消息ID,看业务场景,消费者消费响应后,生产者端可根据消息ID做业务处理
        messageProperties.setCorrelationId(correlationId);
        Vehicle vehicle = new Vehicle(1, "川A0001");
        Message message = new Message(JSON.toJSONString(vehicle).getBytes(), messageProperties);
        rabbitTemplate.convertAndSend("bizExchange","",message);
        System.out.println("生产者发送消息,自定义消息ID为:" + correlationId);
    }

(2) Akzeptieren Sie die Antwortantwort

Nachdem der Verbraucher die Nachricht konsumiert hat, wird das Verarbeitungsergebnis an eine Warteschlange gesendet, um das entsprechende Antwortergebnis zu erhalten Nachricht für die Geschäftsverarbeitung

    /**
     * 接收消息响应
     *
     * @param message
     * @return void
     * @author lei
     * @date 2022-09-19 21:59:27
     */
    @RabbitListener(queues = "replyQueue")
    public void replyResponse(Message message) {
        String s = new String(message.getBody());
        String correlationId = message.getMessageProperties().getCorrelationId();
        System.out.println("收到客户端响应消息ID:" + correlationId);
        //todo 根据消息ID可判断这是哪一个消息的响应,我们就可做业务操作
        System.out.println("收到客户端响应消息:" + s);
    }

(4) Nachrichtenkonsumentenseite

Was der Nachrichtenkonsument tun muss, ist: die Nachricht akzeptieren und dann die Geschäftsverarbeitung durchführen und auf die Nachricht antworten

(1) Methode eins: sendTo-Annotation + Methodenrückgabe value

Im Allgemeinen benötigen wir für die Listener-Methode keinen Rückgabewert. Wir verwenden hier die Annotation „sendTo“, und die zu beantwortende Nachricht muss als Rückgabewert definiert werden to

Wichtige Punkte:

  • 1 Die sendTo-Annotation gibt die entsprechende Warteschlange an (beachten Sie, dass sie mit dem Produktionsende übereinstimmt)

  • 2. Der durch die Methode definierte Rückgabewertinhalt zu beantworten, die schließlich an die sendTo-Annotation gesendet wird, um die entsprechende Warteschlange anzugeben

  • 3 Diese Methode Der Nachteil besteht darin, dass die Verbraucherseite sehr wichtig ist, da die durch sendTo angegebene Zielwarteschlange blind geschrieben werden kann. Dies führt dazu, dass die Produzentenseite die Nachrichtenantwort nicht korrekt empfangen kann, aber ich glaube, dass dies bei allgemeinen Projekten nicht der Fall ist

    /**
     * 方式1   SendTo指定响应队列
     *
     * @param message
     * @return String
     * @author lei
     * @date 2022-09-19 16:17:52
     */
    @RabbitListener(queues ="bizQueue")
    @SendTo("replyQueue")
    public String handleEmailMessage(Message message) {
        try {
            String msg=new String(message.getBody(), StandardCharsets.UTF_8);
            log.info("---consumer接收到消息----{}",msg);
            return "客户端响应消息:"+msg+"处理完成!";
        } catch (Exception e) {
            log.error("处理业务消息失败",e);
        }
        return null;
    }
(2) Methode 2: Lesen Sie die Nachricht vom Produktionsende und senden Sie sie mithilfe einer Vorlage

Genau wie bei der normalen Verbrauchermethode benötigen Sie nur die RabbitListener-Annotation, um die Geschäftswarteschlange abzuhören. Sie müssen jedoch auch die ReplyTo-Adresse basierend auf der Nachricht abrufen und die Nachricht dann manuell innerhalb Ihrer eigenen Verbrauchermethode senden

  • 1. Vorteile: Sie können die Interaktivität von Nachrichtenanfragen und -antworten stärker spüren und der Prozess sieht klarer aus.

  • 2. Nachteile: Der Code ist unelegant. (3) Methode drei: Rückgabewert der Methode Diese Methode stimmt tatsächlich mit 1 überein, aber ich habe sie getestet. Da die Producer-Nachricht die Adresse von ReplyTo angibt, muss der Verbraucher sie nicht erneut manuell angeben, dh wo die Nachricht erstellt werden soll, ob sie antworten soll und wo Um die Antwortnachricht zu senden, ist das Produktionsende von selbst leer, und der Verbraucher muss nur sein eigenes Geschäft verarbeiten und Ergebnisse zurücksenden Antwort:

Erhaltene Antwort:

Link: springboot rabbitmq reply消息直接回复模式怎么实现

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Direktantwortmodus für Springboot RabbitMQ-Antwortnachrichten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen