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中的方法,可以看到控制台打印出如下结果:



猜你喜欢

转载自blog.csdn.net/qq_37936542/article/details/80111555