RabbitMQ 最常用的三大模式实例解析

 更新时间:2019年12月10日 09:34:16   作者:海向  
这篇文章主要介绍了RabbitMQ 最常用的三大模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了RabbitMQ 最常用的三大模式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Direct 模式

  • 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue。
  • Direct 模式可以使用 RabbitMQ 自带的 Exchange: default Exchange,所以不需要将 Exchange 进行任何绑定(binding)操作。
  • 消息传递时,RouteKey 必须完全匹配才会被队列接收,否则该消息会被抛弃,

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class DirectProducer {
  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");

    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_direct_exchange";
    String routingKey = "item.direct";

    //5. 发送
    String msg = "this is direct msg";
    channel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
    System.out.println("Send message : " + msg);

    //6. 关闭连接
    channel.close();
    connection.close();
  }
}
import com.rabbitmq.client.*;
import java.io.IOException;

public class DirectConsumer {

  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");
    factory.setAutomaticRecoveryEnabled(true);
    factory.setNetworkRecoveryInterval(3000);
   
    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_direct_exchange";
    String queueName = "test_direct_queue";
    String routingKey = "item.direct";
    channel.exchangeDeclare(exchangeName, "direct", true, false, null);
    channel.queueDeclare(queueName, false, false, false, null);

    //一般不用代码绑定,在管理界面手动绑定
    channel.queueBind(queueName, exchangeName, routingKey);

    //5. 创建消费者并接收消息
    Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope,
                    AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };

    //6. 设置 Channel 消费者绑定队列
    channel.basicConsume(queueName, true, consumer);

  }
}
 Send message : this is direct msg
 
 [x] Received 'this is direct msg'

Topic 模式

可以使用通配符进行模糊匹配

  • 符号'#" 匹配一个或多个词
  • 符号"*”匹配不多不少一个词

例如

  • 'log.#"能够匹配到'log.info.oa"
  • "log.*"只会匹配到"log.erro“

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class TopicProducer {

  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");

    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_topic_exchange";
    String routingKey1 = "item.update";
    String routingKey2 = "item.delete";
    String routingKey3 = "user.add";

    //5. 发送
    String msg = "this is topic msg";
    channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());
    channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());
    channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());
    System.out.println("Send message : " + msg);

    //6. 关闭连接
    channel.close();
    connection.close();
  }
}
import com.rabbitmq.client.*;
import java.io.IOException;

public class TopicConsumer {

  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");
    factory.setAutomaticRecoveryEnabled(true);
    factory.setNetworkRecoveryInterval(3000);

    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_topic_exchange";
    String queueName = "test_topic_queue";
    String routingKey = "item.#";
    channel.exchangeDeclare(exchangeName, "topic", true, false, null);
    channel.queueDeclare(queueName, false, false, false, null);

    //一般不用代码绑定,在管理界面手动绑定
    channel.queueBind(queueName, exchangeName, routingKey);

    //5. 创建消费者并接收消息
    Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope,
                    AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };
    //6. 设置 Channel 消费者绑定队列
    channel.basicConsume(queueName, true, consumer);

  }
}
Send message : this is topc msg

[x] Received 'this is topc msg'
[x] Received 'this is topc msg'

Fanout 模式

不处理路由键,只需要简单的将队列绑定到交换机上发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
Fanout交换机转发消息是最快的。

import com.rabbitmq.client.*;
import java.io.IOException;

public class FanoutConsumer {
  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");
    factory.setAutomaticRecoveryEnabled(true);
    factory.setNetworkRecoveryInterval(3000);

    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_fanout_exchange";
    String queueName = "test_fanout_queue";
    String routingKey = "item.#";
    channel.exchangeDeclare(exchangeName, "fanout", true, false, null);
    channel.queueDeclare(queueName, false, false, false, null);

    //一般不用代码绑定,在管理界面手动绑定
    channel.queueBind(queueName, exchangeName, routingKey);

    //5. 创建消费者并接收消息
    Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope,
                    AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };

    //6. 设置 Channel 消费者绑定队列
    channel.basicConsume(queueName, true, consumer);
  }
}
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class FanoutProducer {

  public static void main(String[] args) throws Exception {
    //1. 创建一个 ConnectionFactory 并进行设置
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    factory.setVirtualHost("/");
    factory.setUsername("guest");
    factory.setPassword("guest");

    //2. 通过连接工厂来创建连接
    Connection connection = factory.newConnection();

    //3. 通过 Connection 来创建 Channel
    Channel channel = connection.createChannel();

    //4. 声明
    String exchangeName = "test_fanout_exchange";
    String routingKey1 = "item.update";
    String routingKey2 = "";
    String routingKey3 = "ookjkjjkhjhk";//任意routingkey

    //5. 发送
    String msg = "this is fanout msg";
    channel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());
    channel.basicPublish(exchangeName, routingKey2, null, msg.getBytes());
    channel.basicPublish(exchangeName, routingKey3, null, msg.getBytes());
    System.out.println("Send message : " + msg);

    //6. 关闭连接
    channel.close();
    connection.close();
  }
}
Send message : this is fanout msg

[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'
[x] Received 'this is fanout msg'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java操作Excel的示例详解

    Java操作Excel的示例详解

    在平时可以使用IO流对Excle进行操作,但是现在使用更加方便的第三方组件来实现。本文就来和大家聊聊Java如何通过第三方组件实现操作Excel,需要的可以参考一下
    2023-01-01
  • java 服务器接口快速开发之servlet详细教程

    java 服务器接口快速开发之servlet详细教程

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容
    2021-06-06
  • 使用Idea或Datagrip导入excel数据的方法

    使用Idea或Datagrip导入excel数据的方法

    这篇文章主要介绍了使用Idea或Datagrip导入excel数据的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java Enum和String及int的相互转化示例

    Java Enum和String及int的相互转化示例

    这篇文章主要介绍了Java Enum和String及int的相互转化示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Netty核心功能之数据容器ByteBuf详解

    Netty核心功能之数据容器ByteBuf详解

    这篇文章主要为大家介绍了Netty核心功能之数据容器ByteBuf详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • springboot mybatis里localdatetime序列化问题的解决

    springboot mybatis里localdatetime序列化问题的解决

    这篇文章主要介绍了springboot mybatis里localdatetime序列化问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java中的Lombok使用及工作原理详解

    Java中的Lombok使用及工作原理详解

    这篇文章主要介绍了Java中的Lombok使用及工作原理详解,Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发,通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量,需要的朋友可以参考下
    2023-10-10
  • SpringBoot整合第三方技术的详细步骤

    SpringBoot整合第三方技术的详细步骤

    这篇文章主要介绍了SpringBoot整合第三方技术,包括整合Junit、整合Mybatis、整合Mybatis-plus、整合Druid,本文通过实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 如何使用新方式编写Spring MVC接口

    如何使用新方式编写Spring MVC接口

    这篇文章主要介绍了如何使用新方式编写Spring MVC接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java微信退款开发

    Java微信退款开发

    这篇文章主要为大家详细介绍了Java微信退款开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论