Rabbitmq消息队列:Publish/Subscribe发布/订阅模式简单应用

一、生产者

package test.publish;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitmqConUtil;

public class Give {

    //定义交换机
    private final static String EXCHANGE = "test-publish";

    public static void main(String[] args) throws Exception {
        //创建连接和通道
        Connection connection = RabbitmqConUtil.getConnection();
        Channel channel = connection.createChannel();
        //声明交换机(类型fanout->发布订阅模式)
        channel.exchangeDeclare(EXCHANGE,"fanout");
        //发送消息到交换机(交换机无法持久化,如果消息没有及时接收,重启后容易丢失数据)
        channel.basicPublish(EXCHANGE,"",null,"统一发布订阅消息".getBytes());
    }

}

  创建连接和通道后,声明要用到的交换机,并发送消息到交换机中。

  交换机无法持久化,所以一旦停机重启的话,消息就会丢失。

  注:生产者要提前运行一次,初始化交换机的存在,否则如果先启动消费者的话就会造成报交换机不存在的错误。初始化交换机的过程中,不需要带发送消息的操作。

二、消费者

  创建两个消费者GetOne和GetTwo,GetOne的内容大致如下:

package test.publish;

import com.rabbitmq.client.*;
import utils.RabbitmqConUtil;

import java.io.IOException;

public class GetOne {

    private final static String EXCHANGE = "test-publish";
    //定义本消费者需要用到的队列
    private final static String QUEUE = "test-publish-one";

    public static void main(String[] args) throws Exception{
        Connection connection = RabbitmqConUtil.getConnection();
        final Channel channel = connection.createChannel();
        //声明队列
        channel.queueDeclare(QUEUE,false,false,false,null);
        //将队列绑定到交换机
        channel.queueBind(QUEUE,EXCHANGE,"");
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String str = new String(body);
                System.out.println("GetOne接收:" + str);
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume(QUEUE,false,defaultConsumer);

    }
}

  GetTwo的内容与上面一样,更换个名字以便区分两个消费者。

三、运行结果

  先启动一次生产者,把交换机初始化,避免消费者启动接收消息报错(也可以在web管理端自己手动添加,这样就避免初始化了)。

  

  然后,先后启动GetOne和GetTwo两个消费者,将两个队列绑定在交换机上。

  

  最后再重启生产者,发送消息,两个消费者结果如下:

  

  

   都接收到了统一发布的消息。

 

posted @ 2023-11-03 09:03  我命倾尘  阅读(50)  评论(0编辑  收藏  举报