RabbitMQ 六大模式详解及实例

RabbitMQ

1.“Hello World” - 简单模式

RabbitMQ 六大模式详解及实例_第1张图片

1.1 过程

  1. 导入依赖
  2. 创建消息生产者
  3. 创建消息消费者

1.2 详解

1.导入相关依赖

<dependency>
   <groupId>com.rabbitmqgroupId>
   <artifactId>amqp-clientartifactId>
   <version>5.8.0version>
dependency>


<dependency>
   <groupId>commons-iogroupId>
   <artifactId>commons-ioartifactId>
   <version>2.6version>
dependency>
2.创建消费者
  • 设置队列名字

  • 创建一个连接工厂

  • 设置连接到MQ的账户名和密码

  • 创建一个新的连接

  • 创建一个信道

  • 生成一个队列

  • 发送一条消息

    注意:消息必须是byte[]数组类型。

public class Producer {
   
   private static final String QUEUE_NAME = "Hello World";

   public static void main(String[] args) throws Exception {
   
      // 1. 创建一个连接工厂
      ConnectionFactory factory = new ConnectionFactory();
      // 2. 设置连接到MQ的账户、密码和主机地址
		factory.setHost("xx.xx.xx.xx");
      factory.setUsername("admin");
      factory.setPassword("123");
      // 3. 创建一个新连接并处理异常
      Connection connection = factory.newConnection();
      // 4. 创建一个新信道
      Channel channel = connection.createChannel();
      // 5. 生成一个队列
      /**
         * 参数
         * 1.队列名称
         * 2.队列里面的消息是否持久化 默认消息存储在内存中
         * 3.该队列是否只供一个消费者进行消费 是否进行共享;true 可以多个消费者消费
         * 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除;true 自动删除
         * 5.其他参数 -- 通过一个Map传递
         */
      channel.queueDeclare(QUEUE_NAME,false,false,false,null);
      String message = "Hello Pox";
      // 6. 发送一个消息
      /**
         * 参数
         * 1.发送到交换机的名称 -- 这里就不指定具体的交换机
         * 2.路由的 key 
         * 3.其他的参数信息
         * 4.发送消息的消息体
         */
      channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
   }
}
3.创建消费者
  • 设置队列名字

  • 创建一个连接工厂

  • 设置连接到MQ的账户名和密码

  • 创建一个新的连接

  • 创建一个信道

  • 消费消息

    注意:参数中有两个参数,通过函数式接口创建

public class Consumer {
   
   private static final String QUEUE_NAME = "Hello World";

   public static void main(String[] args) throws  Exception{
   
      // 连接到MQ
      ConnectionFactory factory = new ConnectionFactory();
      factory.setHost("xx.xx.xx.xx");
      factory.setUsername("admin");
      factory.setPassword("123");
      Connection connection = factory.newConnection();
      Channel channel = connection.createChannel();

      /*
        * 消费者的另外两个参数为函数式接口,可以通过函数表达式创建
        * */
      // 推送的消息如何进行消费的接口回调
      DeliverCallback deliverCallback=(consumerTag, delivery)->{
   
         String message= new String(delivery.getBody());
         System.out.println(message);
      };
      // 取消 消费的一个回调接口
      CancelCallback cancelCallback=(consumerTag)->{
   
         System.out.println("消息消费被中断");
      };
      /**
         * 消费者消费消息参数:
         * 1.消费哪个队列
         * 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
         * 3.消费者未成功消费的回调
         */
      channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
   }
}

运行RabbitMQ 服务,编写测试程序,运行生产者再运行消费者,在消费者的控制台接收到消息。

2.Work Queues - 工作模式

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

对于来的密集消息时,先将消息封装并发送到队列中。然后再将这些消息分发出去到具体的工作线程进行执行,避免大量消息的堆积。

2.1 过程

RabbitMQ 六大模式详解及实例_第2张图片

  1. 创建工作线程

  2. 创建消息的发送方

  3. 启动多个工作线程进行处理

  4. 消息发送方发送多条消息

工作线程通过轮询的方式处理消息。

2.2 详解

将连接到MQ的过程抽取出来编写为一个工具类。

/*
* RabbitMQ工具类
* */
public class RabbitMQUtil {
   
   /*
    * 通过工具类返回一个MQ信道
    * */
   public static Channel getChannel() throws Exception{
   
      //1.创建一个连接工厂
      ConnectionFactory factory = new ConnectionFactory();
      //2.设置连接的地址、MQ登录的账户和密码
      factory.setHost("xx.xx.xx.xx");
      factory.setUsername("admin");
      factory.setPassword("123");
      //3.创建一个连接
      Connection connection = factory.newConnection();
      //4.返回信道
      return connection.createChannel();
   }
}
1.创建工作线程
public class Worker {
   
    // 定义队列的名字
    private static final String QUEUE_NAME = "Hello World";

    public static void run() throws Exception{
   
        // 将连接到MQ的过程抽取出来编写为一个工具类
        Channel channel = RabbitMQUtil.getChannel();
 

你可能感兴趣的:(rabbitmq,分布式,java)