簡體   English   中英

如何解決后續請求中的錯誤“每個RabbitTemplate僅支持一個ConfirmCallback”

[英]How to fix error “Only one ConfirmCallback is supported by each RabbitTemplate” on subsequent requests

我是RabbitMQ的新手,目前正在RabbitMQ上進行發布,以確認我的Web應用程序中的確認。 在每個新請求上,都將消息發送到RabbitMQ服務器以異步處理它,並且還啟用確認以從RMQ服務器獲得確認。

在本地嘗試時,在第一個請求上很好,但在隨后的請求上,出現以下錯誤“每個RabbitTemplate僅支持一個ConfirmCallback”。

經過一番研究,如果我在設置確認回調之前添加了一個檢查(template.isConfirmListener()),不會出錯。 但是,如果需要,我們如何覆蓋針對不同請求的確認回調? 這是預期的行為還是我在這里做錯了什么?

環境:

  1. Spring Boot版本2.1.7.RELEASE
  2. Java 8

請找到下面的代碼。

控制器文件

package com.example.apis;

import java.util.UUID;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;



@Controller
public class ProducerController {

    @Autowired
    private RabbitTemplate template;

    private String exchange = "test";
    private String routingKey = "test";

    @GetMapping("/send")
    @ResponseBody
    public String sendRequestToRMQ() {


        template.convertAndSend(exchange, routingKey, "Test Message", getCorrelationData());
        template.setMandatory(true);
        template.setConfirmCallback(new ConfirmCallback() {

            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.out.println("Confirm Callback!");
                System.out.println(correlationData.getId());
                System.out.println(ack);
            }
        });

        return "Success";
    }

    @GetMapping("/send1")
    @ResponseBody
    public String sendRequestToRMQ2() {


        template.convertAndSend(exchange, routingKey, "Test Message", getCorrelationData());
        template.setMandatory(true);
        template.setConfirmCallback(new ConfirmCallback() {

            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.out.println("Confirm Callback!");
                System.out.println(correlationData.getId());
                System.out.println(ack);
            }
        });

        return "Success";
    }

    private CorrelationData getCorrelationData() {
        return new CorrelationData(UUID.randomUUID().toString());
    }
}

配置文件

package com.example.conf;

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
 public class ConnectionConfig {
     @Value("${spring.rabbitmq.host:localhost}")
     public String host;

     @Value("${spring.rabbitmq.port:5672}")
     public int port;

     @Value("${spring.rabbitmq.username:guest}")
     public String username;

     @Value("${spring.rabbitmq.password:guest}")
     public String password;

     @Value("${spring.rabbitmq.virtual-host:/}")
     public String virtualHost;

     @Bean
     public ConnectionFactory getConnectionFactory(){
         CachingConnectionFactory factory=new CachingConnectionFactory();
         factory.setHost(host);
         factory.setPort(port);
         factory.setUsername(username);
         factory.setPassword(password);
         factory.setVirtualHost(virtualHost);
         factory.setPublisherConfirms(true);
         factory.setPublisherReturns(true);
         return factory;
     }
 }

請幫我。 謝謝

不,這是預期的行為:只能將一個ConfirmCallback注入RabbitTemplate 您只需要考慮在@PostConstrcut某個位置執行一次此操作,而不是針對每個單個請求執行一次。 當然,您可能需要修改邏輯,因為現在將對所有初始化到RabbitTemplate的請求共享一個ConfirmCallback

您可以在常見的ConfirmCallback考慮一些智能邏輯,以基於getCorrelationData()將請求存儲在映射中,並從回調方法中還原該條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM