簡體   English   中英

具有多個消費者的 Spring Boot RabbitMQ 單隊列

[英]Spring Boot RabbitMQ Single Queue with multiple consumers

我是 Rabbitmq 的新手,我想對多個消費者使用單個隊列,請為多個消費者幫助我,我們如何處理來自單個隊列的多個消費者的請求?

下面是我的單隊列和單消費者代碼

我的配置類

@Configuration
public class ConfigureRabbitMq {

    public static final String EXCHANGE_NAME = "mikeexchange2";
    public static final String QUEUE_NAME = "mikequeue2";


    @Bean
    Queue createQueue() {
        return new Queue(QUEUE_NAME, true, false, false);
    }

    @Bean
    TopicExchange exchange(){
        return new TopicExchange(EXCHANGE_NAME);
    }

    @Bean
    Binding binding(Queue q, TopicExchange exchange){
        return BindingBuilder.bind(q).to(exchange).with("mike.#");
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory
            , MessageListenerAdapter messageListenerAdapter){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(QUEUE_NAME);
        container.setMessageListener(messageListenerAdapter);
        return container;
    }


    @Bean
    MessageListenerAdapter listenerAdapter(Receive handler){
        return new MessageListenerAdapter(handler, "handleMessage");
    }
}

我的接收器類

@Service
public class Receive {

    public void handleMessage(String messageBody){
        System.out.println("HandleMessage!!!");
        System.out.println(messageBody);
        
    }

}

我的發件人類

@RestController
public class Send {

    private final  RabbitTemplate rabbitTemplate;
    
    public  Send(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    
    
    
    @RequestMapping(method = RequestMethod.GET, value = "/api/send/{msg}")
    public String sendMessage(@PathVariable("msg") String themessage){
        
        for(int i=0;i<5000000;i++) {
            rabbitTemplate.convertAndSend(ConfigureRabbitMq.EXCHANGE_NAME,
                    "mike.springmessages", themessage+""+Integer.toString(i));
        }
        return "We have sent a message! :" + themessage;
    }
}

按照您的評論,您實際上還不錯……但是就像 Nik 所說的那樣,使用默認配置,您正在實現負載平衡循環。

如果您使用 spring-boot,請確保為spring-boot-starter-amqp添加依賴spring-boot-starter-amqp

在您的接收方,您通常會遇到以下情況:

@Service
public class Receive {

 @RabbitListener(queues = "<queueName>", concurrency = <numConsumersPerInstance>)
 public void handleMessage(String messageBody){
   ...
 }

提供並發參數可以在一個服務實例中使用多線程消息。 如果您確實希望一個實例同時僅使用一條消息,則可以將此設置為 1。 檢查@RabbitListener的源代碼以@RabbitListener有關並發的進一步指導。

暫無
暫無

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

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