RabbitMq发布订阅模式介绍
之前简单的工作模式主要是生产者发送消息到一个消息队列,比较单一,这里引入了交换机来化解这样的尴尬,只要是绑定了这个交换机的队列都可以收到消息生产者发送的消息,这样就像你和你朋友订阅了一个微信公众号之后收到同样的消息,这样就组成了发布订阅模式
交换机的介绍
一共有以下四种交换机:
- Direct Exchange(用于路由模式)
- Fanout Exchange(用于发布订阅模式)
- Topic Exchange (用于主题模式)
- Headers Exchanges
FanoutProducer编写
发布订阅模式主要使用
Fanout
交换机,代码编写如下
public class FanoutProducer {
public static void main(String[] args) throws Exception{
Channel channel = RabbitMqUtils.getChannel();
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()){
channel.basicPublish(CustomerFanoutExchangeOne.EXCHANGE_NAME,"", MessageProperties.PERSISTENT_TEXT_PLAIN,(scanner.next()).getBytes());
System.out.println("消息发送");
}
}
}
消费者One
public class CustomerFanoutExchangeOne {
public static final String EXCHANGE_NAME="logs";
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
// 声明个交换机
channel.exchangeDeclare(CustomerFanoutExchangeOne.EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
//声明一个临时队列
/**
* 生成一个临时队列,队列名称是随机的
* 当消费者断开与队列的链接的时候,队列就自动删除
*/
String queue = channel.queueDeclare().getQueue();
/**
* 绑定交换机
*
*/
channel.queueBind(queue,EXCHANGE_NAME,"");
System.out.println("消息的接收.......");
DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
System.out.println("消息消费: "+new String(message.getBody()));
/**
* 1.消息的标记 tag
* 2.是否批量应答
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
CancelCallback cancelCallback=(consumerTag)->{
System.out.println("消息消费被中断");
};
channel.basicConsume(queue,false,deliverCallback,cancelCallback);
}
}
消费者Two
public class CustomerFanoutExchangeTwo {
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
// 声明个交换机
channel.exchangeDeclare(CustomerFanoutExchangeOne.EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
//声明一个临时队列
/**
* 生成一个临时队列,队列名称是随机的
* 当消费者断开与队列的链接的时候,队列就自动删除
*/
String queue = channel.queueDeclare().getQueue();
/**
* 绑定交换机
*
*/
channel.queueBind(queue, CustomerFanoutExchangeOne.EXCHANGE_NAME,"");
System.out.println("消息的接收.......");
DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
System.out.println("消息消费: "+new String(message.getBody()));
/**
* 1.消息的标记 tag
* 2.是否批量应答
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
CancelCallback cancelCallback=(consumerTag)->{
System.out.println("消息消费被中断");
};
channel.basicConsume(queue,fasle,deliverCallback,cancelCallback);
}
}
启动代码
FanoutProducer发送消息AA BB
消费者One收到消息AA BB
消费者Two收到消息AA BB