RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会( 三 )

3.1.2、Receiver1.javaimport com.rabbitmq.client.*;import top.san.RabbitMq.util.RabbitmqConnectionUtil;import java.io.IOException;public class Receiver1 {//交换机名称private final static String EXCHANGE_NAME = "test_exchange_fanout";//队列名称private static final String QUEUE_NAME= "test_queue_email";public static void main(String[] args){try{//获取连接Connection connection = RabbitmqConnectionUtil.getConnection();//从连接中获取一个通道final Channel channel = connection.createChannel();//声明交换机(分发:发布/订阅模式)channel.exchangeDeclare(EXCHANGE_NAME, "fanout");//声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);//将队列绑定到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");//保证一次只分发一个int prefetchCount = 1;channel.basicQos(prefetchCount);//定义消费者DefaultConsumer consumer = new DefaultConsumer(channel){//当消息到达时执行回调方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException{String message = new String(body, "utf-8");System.out.println("[email] Receive message:" + message);try{//消费者休息2s处理业务Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}finally{System.out.println("[1] done");//手动应答channel.basicAck(envelope.getDeliveryTag(), false);}}};//设置手动应答boolean autoAck = false;//监听队列channel.basicConsume(QUEUE_NAME, autoAck, consumer);}catch (IOException e){e.printStackTrace();}}}3.1.3、Receiver2.javaimport com.rabbitmq.client.*;import top.san.RabbitMq.util.RabbitmqConnectionUtil;import java.io.IOException;public class Receiver2 {//交换机名称private final static String EXCHANGE_NAME = "test_exchange_fanout";//队列名称private static final String QUEUE_NAME= "test_queue_phone";public static void main(String[] args){try{//获取连接Connection connection = RabbitmqConnectionUtil.getConnection();//从连接中获取一个通道final Channel channel = connection.createChannel();//声明交换机(分发:发布/订阅模式)channel.exchangeDeclare(EXCHANGE_NAME, "fanout");//声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);//将队列绑定到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");//保证一次只分发一个int prefetchCount = 1;channel.basicQos(prefetchCount);//定义消费者DefaultConsumer consumer = new DefaultConsumer(channel){//当消息到达时执行回调方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException{String message = new String(body, "utf-8");System.out.println("[phone] Receive message:" + message);try{//消费者休息1s处理业务Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}finally{System.out.println("[2] done");//手动应答channel.basicAck(envelope.getDeliveryTag(), false);}}};//设置手动应答boolean autoAck = false;//监听队列channel.basicConsume(QUEUE_NAME, autoAck, consumer);}catch (IOException e){e.printStackTrace();}}}3.1.4、结果从程序运行结果和RabbitMq的后台看出,这样的消息属于广播型,两个不同名的队列的都能收到该消息,只需它们都将自己绑定到同一个交换机,而且,该消息是持久的,只要交换机还在,消费者啥时候上线都能消费它所绑定的交换机,而且只会一个消费者只会消费一

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会

文章插图
 

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会

文章插图
 

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会

文章插图
 

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会

文章插图
 
4、路由(direct)
  1. 在前面的示例中,我们已经在创建绑定 。您可能会想起类似的代码:
channel.queueBind(queueName,EXCHANGE_NAME,“”);绑定是交换和队列之间的关系 。可以简单地理解为:队列对来自此交换的消息感兴趣 。
  1. 绑定可以采用额外的routingKey参数 。为了避免与basic_publish参数混淆,我们将其称为 绑定键 。这是我们可以创建带有键的绑定的方法:
channel.queueBind(queueName,EXCHANGE_NAME,“ black”);
  • 直接绑定(密钥直接绑定到单个队列)

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会

文章插图
 
  • 多重绑定(相同的绑定密钥绑定多个队列)

RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会


推荐阅读