一.订阅模式
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();
        }

    }
}