Spring 整合 RabbitMQ 的实现
RabbittMq的五种队列:
简单队列 :
P:消息的生产者
C:消息的消费者
红色:队列
生产者将消息发送到队列,消费者从队列中获取消息。
WORK模式:
一个生产者、2个消费者。
一个消息只能被一个消费者获取。
订阅模式:

解读:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
路由模式:
解读:和订阅模式的区别在于,路由模式通过指定key来确认消息路由到那个队列
通配符模式:



介绍完五种模式之后,开始整合
一:使用路由模式进行整合
1:maven依赖
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.4.6.RELEASE</version> </dependency>
2:发送者的配置文件 applicationContext-rabbitmq-send.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <!-- 配置连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="114.215.83.3" port="5672" username="test" password="123456" /> <!-- 定义mq管理 --> <rabbit:admin connection-factory="connectionFactory" /> <!-- 声明队列 --> <rabbit:queue name="que_cat" auto-declare="true" durable="true" /> <rabbit:queue name="que_pig" auto-declare="true" durable="true" /> <!-- 定义交换机绑定队列(路由模式) --> <rabbit:direct-exchange name="IExchange" id="IExchange"> <rabbit:bindings> <rabbit:binding queue="que_cat" key="que_cat_key" /> <rabbit:binding queue="que_pig" key="que_pig_key" /> </rabbit:bindings> </rabbit:direct-exchange> <!-- 消息对象json转换类 --> <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /> <!-- 定义模版 --> <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="IExchange" message-converter="jsonMessageConverter" /> </beans>
3:接收者的配置文件 applicationContext-rabbitmq-recep.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"> <!-- 配置连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="114.215.83.3" port="5672" username="test" password="123456" /> <!-- 定义mq管理 --> <rabbit:admin connection-factory="connectionFactory" /> <!-- 声明队列 --> <rabbit:queue name="que_cat" auto-declare="true" durable="true" /> <rabbit:queue name="que_pig" auto-declare="true" durable="true" /> <!-- 定义消费者 --> <bean name="catHandler" class="com.debo.rabbitmq.CatHandler" /> <bean name="pigHandler" class="com.debo.rabbitmq.PigHandler" /> <!-- 定义消费者监听队列 --> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener ref="catHandler" queues="que_cat" /> <rabbit:listener ref="pigHandler" queues="que_pig" /> </rabbit:listener-container> </beans>
4:定义消费者CatHandler、PigHandler
package com.debo.rabbitmq;
import java.io.IOException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class PigHandler implements MessageListener {
private static final ObjectMapper MAPPER = new ObjectMapper();
public void onMessage(Message msg) {
try {
//msg就是rabbitmq传来的消息,需要的同学自己打印看一眼
// 使用jackson解析
JsonNode jsonData = MAPPER.readTree(msg.getBody());
System.out.println("我是可爱的小猪,我的id是" + jsonData.get("id").asText()
+ ",我的名字是" + jsonData.get("name").asText());
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.debo.rabbitmq;
import java.io.IOException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class CatHandler implements MessageListener {
private static final ObjectMapper MAPPER = new ObjectMapper();
public void onMessage(Message msg) {
try {
//msg就是rabbitmq传来的消息
// 使用jackson解析
JsonNode jsonData = MAPPER.readTree(msg.getBody());
System.out.println("我是可爱的小猫,我的id是" + jsonData.get("id").asText()
+ ",我的名字是" + jsonData.get("name").asText());
} catch (IOException e) {
e.printStackTrace();
}
}
}
5:测试 RabbitmqController:
package com.debo.rabbitmq;
import java.util.HashMap;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value="rabbit")
public class RabbitmqController<V> {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping(method=RequestMethod.GET)
public void test(){
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", "1");
map.put("name", "pig");
//根据key发送到对应的队列
rabbitTemplate.convertAndSend("que_pig_key", map);
map.put("id", "2");
map.put("name", "cat");
//根据key发送到对应的队列
rabbitTemplate.convertAndSend("que_cat_key", map);
}
}
启动项目,访问RabbitmqController中的方法,可以看到控制台打印出如下结果:

二:使用通配符模式
基本配置和路由差不多,唯一的差别就是发送者的配置文件 applicationContext-rabbitmq-send.xml中交换机的配置
<!-- 定义交换机绑定队列(通配符模式) #匹配一个或多个词 *匹配一个词 --> <rabbit:topic-exchange name="IExchange" id="IExchange"> <rabbit:bindings> <rabbit:binding queue="que_cat" pattern="cat.#"/> <rabbit:binding queue="que_pig" pattern="pig.#" /> </rabbit:bindings> </rabbit:topic-exchange>
测试:
package com.debo.rabbitmq;
import java.util.HashMap;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value="rabbit")
public class RabbitmqController<V> {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping(method=RequestMethod.GET)
public void test(){
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", "1");
map.put("name", "pigAdd");
//匹配pig.#的key 都会发送到 que_pig队列
rabbitTemplate.convertAndSend("pig.add", map);
map.put("name", "pigUpdate");
rabbitTemplate.convertAndSend("pig.update", map);
map.put("name", "pigDelete");
rabbitTemplate.convertAndSend("pig.delete", map);
map.put("id", "2");
map.put("name", "catAdd");
//匹配cat.#的key 都会发送到 que_cat队列
rabbitTemplate.convertAndSend("cat.add", map);
map.put("name", "catUpdate");
rabbitTemplate.convertAndSend("cat.update", map);
map.put("name", "catDelete");
rabbitTemplate.convertAndSend("cat.delete", map);
}
}
启动项目,访问RabbitmqController中的方法,可以看到控制台打印出如下结果:

浙公网安备 33010602011771号