rabbitmq发布订阅模式
rabbitmq发布订阅模式
将接收到的所有消息广播到它知道的所有队列中,对应的交换机类型为fanout
代码实现

消费者A
package com.yl.pubsub;
import com.rabbitmq.client.*;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;
import java.io.IOException;
/**
* 消费者A
*
* @author Y-wee
*/
public class ConsumerA {
public static void main(String[] args) throws IOException {
Connection connection = RabbitUtils.getConnection();
Channel channel = connection.createChannel();
// 声明一个交换机
channel.exchangeDeclare(RabbitConstant.EXCHANGE_PUBSUB, BuiltinExchangeType.FANOUT);
// 声明一个临时队列,当消费者与队列断开连接,队列就会自动删除
String queue = channel.queueDeclare().getQueue();
// 将队列与交换机绑定
channel.queueBind(queue, RabbitConstant.EXCHANGE_PUBSUB,"");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("ConsumerA接收到消息:"+new String(message.getBody()));
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消费失败");
};
channel.basicConsume(queue, false, deliverCallback, cancelCallback);
}
}
RabbitUtils是笔者自定义的一个工具类,用来获取连接
RabbitConstant是笔者自定义的一个常量类,里面存储了队列名和交换机名
消费者B
package com.yl.pubsub;
import com.rabbitmq.client.*;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;
import java.io.IOException;
/**
* 消费者B
*
* @author Y-wee
*/
public class ConsumerB {
public static void main(String[] args) throws IOException {
Connection connection = RabbitUtils.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(RabbitConstant.EXCHANGE_PUBSUB, BuiltinExchangeType.FANOUT);
String queue = channel.queueDeclare().getQueue();
channel.queueBind(queue, RabbitConstant.EXCHANGE_PUBSUB,"");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("ConsumerB接收到消息:"+new String(message.getBody()));
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消费失败");
};
channel.basicConsume(queue, false, deliverCallback, cancelCallback);
}
}
生产者
package com.yl.pubsub;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;
import java.io.IOException;
import java.util.Scanner;
/**
* 生产者
*
* @author Y-wee
*/
public class Provider {
public static void main(String[] args) throws IOException {
Connection connection = RabbitUtils.getConnection();
Channel channel = connection.createChannel();
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()){
String message=scanner.next();
channel.basicPublish(RabbitConstant.EXCHANGE_PUBSUB,"",null,message.getBytes());
System.out.println("生产者发出消息:"+message);
}
}
}
结果:两个消费者都能收到生产者发送的消息
记得快乐
浙公网安备 33010602011771号