还是直接通过队列进行消息传递,不同的是有多个消费者监听同一个队列,轮询消费消息,同一个消息只会被一个消费者消费
消费者代码
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUsername("root");
connectionFactory.setPassword("root");
connectionFactory.setHost("192.168.216.200");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("my");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("work_queue",true,false,false,null);
//向队列中发送10条消息
for(int i=0;i<10;i++){
String body="第"+i+"条消息";
channel.basicPublish("","work_queue",null,body.getBytes());
}
channel.close();
connection.close();
消费者1代码
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUsername("root");
connectionFactory.setPassword("root");
connectionFactory.setHost("192.168.216.200");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("my");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumer1消费--》" + new String(body));
}
};
channel.basicConsume("work_queue",true,consumer);
消费者2代码
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("consumer2消费--》" + new String(body));
}
};
channel.basicConsume("work_queue",true,consumer);
总结
多个消费者监听同一个队列,进行消费时是轮替消费消息,一个消息只会被一个消费者消费