如图,可以用看到,工作队列有多个消费者
一、工作队列配置
@Configuration
public class WorkMqConfig {
private final static String workQunne = "workMq";
@Bean
public Queue workMq() {
return new Queue(workQunne);
}
}
二、生产者
@Controller
@RequestMapping("workMq")
public class WorkProducer {
private Logger logger= LoggerFactory.getLogger(WorkProducer.class);
@Autowired
private AmqpTemplate rabbitTemplate;
@RequestMapping("/sendMessage")
public void send() {
for (int i=0;i<10;i++){
this.rabbitTemplate.convertAndSend("workMq", i);
}
}
}
三、消费者
消费者1:
@Component
public class WorkCustomer {
private Logger logger= LoggerFactory.getLogger(WorkCustomer.class);
@RabbitListener(queues="workMq")
public void processA(int msg) {
logger.info("ReceiveA:"+msg);
}
}
消费者2:
@Component
public class WorkCustomer2 {
private Logger logger= LoggerFactory.getLogger(WorkCustomer2.class);
@RabbitListener(queues="workMq")
public void processA(int i) {
logger.info("ReceiveB:"+i);
}
}
测试:
利用postman调用接口,发送消息,执行结果如下:
可以看到,队列中的消息发送到两个消费者是一个轮询的效果
如果希望不希望轮询的效果,而是根据两个消费者消费消息的能力来消费消息呢?比如A能更快地消费消息,则将更多的消息给A
代码:
修改WorkCustomer2代码为如下:
@Component
public class WorkCustomer2 {
private Logger logger= LoggerFactory.getLogger(WorkCustomer2.class);
@RabbitListener(queues="workMq")
public void processA(int i) throws InterruptedException{
Thread.sleep(3000);
logger.info("ReceiveB:"+i);
}
}
修改mq配置:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setPrefetchCount(1);
configurer.configure(factory, connectionFactory);
// factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); //开启手动 ack
return factory;
}
测试:
源码地址:
链接:https://pan.baidu.com/s/1K2L-Gxng9i5D9dTv2WPGlA
提取码:xhyx