一.订阅模式 1.生产者代码示例 public class publish_subscribe_producer { // 创建一个名为QUEUE_NAME的队列,防止队列不存在 private final static String QUEUE_NAME = "csl"; // 创建一个交换机 private final static String EXCHANGE_NAME = "testexchange"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = null; Channel channel = null; try { //获取链接 connection = RabbitMqConfig.devConnectionFactory(); //创建信息管道 channel = connection.createChannel(); //声明队列,如果队列在则什么都不做,如果队列不在创建队列 // 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); for (int i = 0; i < 10; i++) { Thread.sleep(500);//模拟耗时操作,别发那么快 //自定义消息 String msg = "发布订阅模式" + i; //发布消息,通过交换器名称进行发布消息,无需指定队列名称 channel.basicPublish(EXCHANGE_NAME,"",null,msg.getBytes()); System.out.println("-->send " + msg); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }finally { //关闭管道 channel.close(); //关闭连接 connection.close(); } } }
2.消费者1号代码示例
public class publish_subscribe_consumer { // 创建一个名为QUEUE_NAME的队列,防止队列不存在 private final static String QUEUE_NAME = "csl"; // 创建一个交换机 private final static String EXCHANGE_NAME = "testexchange"; public static void main(String[] args) { try { //获取链接 Connection connection = RabbitMqConfig.devConnectionFactory(); //创建信息管道 Channel channel = connection.createChannel(); //声明队列,如果队列在则什么都不做,如果队列不在创建队列 // 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); //定义消费者 DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { //获取并转成String String message = new String(body, "UTF-8"); System.out.println("-->1号消费者收到消息,msg:"+message); } }; //监听队列 channel.basicConsume(QUEUE_NAME, true, consumer); } catch (IOException e) { e.printStackTrace(); } } }
3.消费者2号代码示例
public class publish_subscribe_consumer2 { // 创建一个名为QUEUE_NAME的队列,防止队列不存在 private final static String QUEUE_NAME = "csl2"; // 创建一个交换机 private final static String EXCHANGE_NAME = "testexchange"; public static void main(String[] args) { try { //获取链接 Connection connection = RabbitMqConfig.devConnectionFactory(); //创建信息管道 Channel channel = connection.createChannel(); //声明队列,如果队列在则什么都不做,如果队列不在创建队列 // 1.队列名 2.是否持久化(开启持久化可以防止重启时数据丢失) 3.是否排外(作用1:当我们连接关闭后是否自动删除队列 作用2:是否私有当前队列,如果私有了,其他通道不可以访问) 4.不再使用是否自动删除 5.其他的属性 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //声明交换机 定义一个交换机,类型为fanout,也就是发布订阅模式 channel.exchangeDeclare(EXCHANGE_NAME, "fanout"); channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ""); //定义消费者 DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { //获取并转成String String message = new String(body, "UTF-8"); System.out.println("-->2号消费者收到消息,msg:"+message); } }; //监听队列 channel.basicConsume(QUEUE_NAME, true, consumer); } catch (IOException e) { e.printStackTrace(); } } }