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实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K0552b0-7.jpg)
文章插图
![RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K055O51-8.jpg)
文章插图
![RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K05513E-9.jpg)
文章插图
![RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K0555V7-10.jpg)
文章插图
4、路由(direct)
- 在前面的示例中,我们已经在创建绑定 。您可能会想起类似的代码:
channel.queueBind(queueName,EXCHANGE_NAME,“”);
绑定是交换和队列之间的关系 。可以简单地理解为:队列对来自此交换的消息感兴趣 。- 绑定可以采用额外的routingKey参数 。为了避免与basic_publish参数混淆,我们将其称为 绑定键 。这是我们可以创建带有键的绑定的方法:
channel.queueBind(queueName,EXCHANGE_NAME,“ black”);
- 直接绑定(密钥直接绑定到单个队列)
![RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K0552109-11.jpg)
文章插图
- 多重绑定(相同的绑定密钥绑定多个队列)
![RabbitMq七种工作模式,结合简单的java实例使用,别再说你不会](http://img.jiangsulong.com/220420/0K0551644-12.jpg)
推荐阅读
- 计算机专业学什么语言好找工作?
- 残疾人|本科没拿到学位证对以后找工作有多大影响?
- 鲜虾萝卜饼的做法
- 没有工作的一年|《没有工作的一年》赚钱还是躺平?小雨租房也乐观,却源于这一点
- 招聘|考研究生反而不好找工作,日本人这点很认真,大家觉得应该学吗?
- 教师|想上岸入编找到理想工作,该如何选择单位?随我一起来看看吧!
- 犀角化毒丸怎么样
- 戴尔Precision 5750移动工作站深度测试
- 教你快速清除Excel工作表保护密码
- excel批量拆分工作簿,用VBA一键拆分,把数据分解到N个工作簿