问题引入
最近在项目中会经常使用到消息队列RabbitMQ,每一次使用时都需要先配置连接工厂生成连接,再通过连接创建通道,最后通过去配置通道的参数进行几种不同模式的生产消费操作,如此操作极其影响开发的效率。
Java的核心封装思想是不允许有如此繁琐且反复的操作的,所以,作为一位极具上进心又极富责任心的javaer有义务也有责任将其复杂的过程封装及简化!
思路整理
RabbitMQ消息传递常用的有五种模式:简单模式(Simple),工作模式(Work),订阅模式(Subscribe),路由模式(Routing)和主题模式(Topics)
这五种模式又可以细分为两大类:使用交换机(exchange)和不使用交换机(exchange)
-
简单模式和工作模式:直接发送消息给队列所以不使用交换机
简单模式和工作模式区别又在于消费者数量上
简单模式是一对一的,所以只需声明一个消费者
工作模式是一对多,所以需声明两个或以上的消费者队列。
-
订阅模式,路由模式和主题模式:把消息发送给交换机,再由交换机发送消息到队列里
订阅模式需设置交换机类型为fanout,即发送给所有绑定了交换机的消息队列
路由模式的交换机类型为direct,并且在声明消费者时需要绑定生产者的路由键,生产者每次发送消息时绑定一个或多个路由键,只发送消息给具有相同路由键的消费者
主题模式交换机类型设置为topic,用法和路由模式一样,只是路由键可以模糊匹配
通过以上的总结发现,如果要同时实现以上的所有模式只需要通过判断是否声明交换机和声明交换机的类型,以及声明消费者的数量即可实现
具体步骤
使用RabbitMQ无非两个步骤
-
通过配置连接工厂参数生成连接
public static Connection getConnection() throws Exception { //定义连接工厂 ConnectionFactory factory = new ConnectionFactory(); //设置服务地址 factory.setHost("127.0.0.1"); //端口 factory.setPort(5672); //设置账号信息,用户名、密码、vhost factory.setVirtualHost("testhost"); factory.setUsername("admin"); factory.setPassword("admin"); // 通过工厂获取连接 Connection connection = factory.newConnection(); return connection; }
-
通过连接创建通道,声明生产者通道发送消息和消费者通道获取消息
简单模式下生产者声明并发送消息
// 通过连接创建通道 Channel channel = connection.createChannel(); // 声明消息队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 消息内容 channel.basicPublish("", QUEUE_NAME, null, "first message".getBytes());
简单模式下消费者获取消息
// 获取到连接以及mq通道 Connection connection = ConnectionUtil.getConnection(); // 从连接中创建通道 Channel channel = connection.createChannel(); // 声明队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); //设置服务器一次发送的消息条数 channel.basicQos(1); //接收消息 final Consumer consumer = new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { //把byte类型转换为字符串 String message = new String(body); System.out.println("接收到的消息:"+message); //向服务器确认已接收 channel.basicAck(envelope.getDeliveryTag(), false); } }; //设置消费者是否自动确认 channel.basicConsume(QUEUE_NAME,true,consumer);
封装RabbitMQ的具体的实施步骤
第一步通过连接工厂配置参数生成连接是每一次使用消息队列时的必经步骤,设置参数的过程不会有变化,所以我们可以直接进行封装成一个连接工具类或工具方法,并从外部的配置文件里读取数据,并进行相应的配置
第二步我们通过读取配置文件,判断是否配置交换机,交换机类型和消费者数量,以及其他参数来实现我们的几种模式以及具体的生产消费操作
项目地址
项目README中有具体介绍项目用法和项目的结构和类作用
encapsulation_rabbitmq