Fanout exchange
扇形交换器,以广播的形式发送,不管消费者是否有相匹配的绑定键,都会收到消息。就像你买了商品A,人家还硬要把商品B都送给你,买一送一。
我们具体看下实例:
生产者
发送消息:
Send apple:Hello,RabbitMq1
Send orange:Hello,RabbitMq2
Send pear:Hello,RabbitMq3
package com.enjoy.testrabbitmq;
import com.enjoy.common.RabbitmqConnection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
*类说明:fanout类型交换器的生产者
*/
public class TestProducerFanout {
public final static String EXCHANGE_NAME = "fanout_exchange";
public static void main(String[] args)
throws IOException, TimeoutException {
/* 创建连接,连接到RabbitMQ*/
Connection connection = RabbitmqConnection.getConnection();
/*创建信道*/
Channel channel = connection.createChannel();
/*创建fanout交换器*/
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
/*日志消息级别,作为路由键使用*/
String[] routekeys = {"apple","orange","pear"};
for(int i=0;i<3;i++){
String routekey = routekeys[i%3];
String msg = "Hello,RabbitMq"+(i+1);
/*发布消息,需要参数:交换器,路由键,其中以日志消息级别为路由键*/
channel.basicPublish(EXCHANGE_NAME,routekey,null,
msg.getBytes());
System.out.println("Send "+routekey+":"+msg);
}
channel.close();
connection.close();
}
}
消费者:
绑定键other,但是确收到了生产者发送的全部消息
waiting for message........
Received[apple]Hello,RabbitMq1
Received[orange]Hello,RabbitMq2
Received[pear]Hello,RabbitMq3
package com.enjoy.testrabbitmq;
import com.enjoy.common.RabbitmqConnection;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
*类说明:普通的消费者
*/
public class TestConsumerFanout {
public static void main(String[] argv)
throws IOException, TimeoutException {
/* 创建连接,连接到RabbitMQ*/
Connection connection = RabbitmqConnection.getConnection();
final Channel channel = connection.createChannel();
channel.exchangeDeclare(TestProducerFanout.EXCHANGE_NAME,
"fanout");
/*声明一个队列*/
String queueName = channel.queueDeclare().getQueue().substring(4);
channel.queueDeclare(queueName,false,false,
false,null);
/*绑定,将队列和交换器通过路由键进行绑定*/
String routekey = "other";
channel.queueBind(queueName,TestProducerFanout.EXCHANGE_NAME,routekey);
System.out.println("waiting for message........");
/*声明了一个消费者*/
final 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("Received["+envelope.getRoutingKey()
+"]"+message);
}
};
/*消费者正式开始在指定队列上消费消息*/
channel.basicConsume(queueName,true,consumer);
}
}