RabbitMQ的发布订阅模式
发布订阅模式
是群发的概念,每条消息可以发送给多个消费者
在订阅模型中,多了一个 Exchange 角色
Exchange:交换机(X)。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、 递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:
-
Fanout:广播,将消息交给所有绑定到交换机的队列
-
Direct:定向,把消息交给符合指定routing key 的队列
-
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange 绑定,或者没有符合 路由规则的队列,那么消息会丢失
Exchange和Queue之间还需要绑定才能发送消息
生产者代码
public class PSProducer {public static void main(String[] args) throws Exception {//创建连接ConnectionFactory cf = new ConnectionFactory();cf.setHost("192.168.64.140");ccf.setPort(5672);//可选,5672是默认端口f.setUsername("guest");cf.setPassword("guest");Connection nc = cf.newConnection();Channel cc = nc.createChannel();//定义交换机//服务器中如果没有交换机,就创建,有就直接使用cc.exccangeDeclare("logs", "fanout");//向交换机发送数据while(true) {System.out.print("输入:");String s = new Scanner(System.in).nextLine();cc.basicPublish("logs", "", null, s.getBytes());}}
}
消费者代码
public class PSConsumer {public static void main(String[] args) throws Exception {//创建连接ConnectionFactory cf = new ConnectionFactory();cf.setHost("192.168.64.140");ccf.setPort(5672);//可选,5672是默认端口f.setUsername("guest");cf.setPassword("guest");Connection nc = cf.newConnection();Channel cc = nc.createChannel();//定义交换机//服务器中如果没有交换机,就创建,有就直接使用cc.exccangeDeclare("logs", "fanout");//cc.queueDeclare(UUID.randomUUID().toString(), false, true, true, null);String queue = cc.queueDeclare().getQueue();cc.queueBind(queue, "logs", "");//处理数据DeliverCallback deliverCallback = new DeliverCallback() {@Overridepublic void handle(String consumerTag, Delivery message) throws IOException {byte[] a = message.getBody();String b = new String(a);System.out.println("收到:"+b);System.out.println("消息处理完毕");}};CancelCallback cancelCallback = new CancelCallback() {@Overridepublic void handle(String consumerTag) throws IOException {}};//3.接收数据/**第二个参数:* true:自动确认* false:手动确认*/cc.basicConsume(queue,true, deliverCallback, cancelCallback);}
}
上一篇文章:RabbitMQ的工作模式-CSDN博客https://blog.csdn.net/Z0412_J0103/article/details/143354823下一篇文章: