Spring Boot RabbitMQ具有多个使用者的单一队列



我是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的依赖项。

在你的接收端,你通常会有类似的smth

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

通过提供并发参数,可以在一个服务实例中使用多线程消息。如果您确实希望一个实例同时只使用一条消息,则可以将其设置为1。检查@RabbitListener的源代码,以获得有关并发的进一步指导。

最新更新