1.fanout 发布/订阅
在上一篇中队列都指定了名称,现在我们需要所有的日志信息,而不只是其中的一个。如果要做这样的队列,我们需要2件事,一个就是获取一个新的空的队列,这样我就需要创建一个随机名称的队列,最好让服务器帮我们做出选择,第一个就是我们断开用户的队列,应该自动进行删除。
生产者:
/**
* 发布/订阅 生产者
*/
public class EmitLog {
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");//fanout表示分发,所有的消费者得到同样的队列信息
for (int i = 0 ; i<10;i++){
String message = "hello fanout "+i;
channel.basicPublish(EXCHANGE_NAME,"",null,message.getBytes("utf-8"));
System.out.println("emitLog send '"+message+"'");
}
channel.close();
connection.close();
}
}
消费者(两个消费者代码一样):
/**
* 消费者
*/
public class ReceiveLogs1 {
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
//产生一个随机的队列名称
String queue = channel.queueDeclare().getQueue();
//对队列进行绑定
channel.queueBind(queue,EXCHANGE_NAME,"");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "utf-8");
System.out.println("ReceiveLogs1 Received '" + message + "'");
}
};
channel.basicConsume(queue,true,consumer); //从队列中删除
}
}
查看结果:
生产者:
消费者1: