【RabbitMQ】RabbitMQ与Spring整合

  这里我们使用RabbitMQ消息通信,后台添加商品,通知前台,删除与商品相关的缓存内容。在后台系统中,我们定义交换器和模板。在前台系统中定义队列,监听和模板。在Web的管理工具中绑定交换器和队列;

后台系统

1.在Pom.xml文件中引入依赖

		
			org.springframework.amqp
			spring-rabbit
			1.4.0.RELEASE
		


2.把RabbitMQ加入到Spring的管理中。



    
    

	
	
                               
     
    
    	
	
     
                               

3.属性配置

rabbitmq.ip=127.0.0.1
rabbitmq.port=5672
rabbitmq.username=taotao
rabbitmq.password=taotao
rabbitmq.vhost=/taotao

4.后台系统在添加商品的时候,向交换器中发送消息

@Service
public class ItemServiceImpl implements ItemService {

	@Autowired
	private TbItemMapper itemMapper;
	@Autowired
	private TbItemDescMapper itemDescMapper;
	@Autowired
	private TbItemParamItemMapper itemParamItemMapper;
	//****************************************************
	@Autowired
	private RabbitTemplate rabbitTemplate;

	private final static ObjectMapper MAPPER=new ObjectMapper();
	//****************************************************
	 * 添加商品信息;
	 * itemParam商品规格参数
	 */
	@Override
	public TaotaoResult createItem(TbItem item, String desc,String itemParam) {
		//生成商品id
		long itemId = IDUtils.genItemId();
		//补全TbItem属性
		item.setId(itemId);
		//商品状态:1-正常,2-下架,3-删除
		item.setStatus((byte)1);
		//创建时间和更新时间
		Date date = new Date();
		item.setCreated(date);
		item.setUpdated(date);
		//插入商品表
		itemMapper.insert(item);
		//商品描述
		TbItemDesc itemDesc = new TbItemDesc();
		itemDesc.setItemId(itemId);
		itemDesc.setItemDesc(desc);
		itemDesc.setCreated(date);
		itemDesc.setUpdated(date);
		//插入商品描述数据;
		itemDescMapper.insert(itemDesc);
		
		//商品规格参数
		TbItemParamItem itemParamItem = new TbItemParamItem();
		itemParamItem.setItemId(itemId);
		itemParamItem.setParamData(itemParam);
		itemParamItem.setCreated(date);
		itemParamItem.setUpdated(date);
		//插入商品规格参数;
		itemParamItemMapper.insert(itemParamItem);

		
		//***************************************************
		//发送消息给其他系统
		sendMsg(item.getId(), "insert");
		
		//****************************************************
		
		return TaotaoResult.ok();
	}
		
	//后台系统关于RabbitMQ消息通信的配置;
	private void sendMsg(long itemId,String type)
	{
		//处理异常,不能影响正常的业务逻辑,所以应该抓取;
		try {
			//发送消息通知其他系统
			Map msg= new HashMap();
			msg.put("itemId", itemId);
			msg.put("type",type);
			msg.put("date", System.currentTimeMillis());
			//指定路由键和消息
			//消息中包含,商品Id;	
			this.rabbitTemplate.convertAndSend("item." + type,MAPPER.writeValueAsString(msg));
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

前台系统


1和3拷贝到前台系统相关位置

RabbitMQ的配置如下



	
    
    

	
	
	
	
	

	                               
	
	
		
	
	
     
                               

  创建一个消费者,当添加商品的时候,删除缓存中商品前缀的内容。

package com.taotao.rest.mq;

import java.util.Iterator;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.taotao.rest.component.JedisClient;

	/**
	 * 商品消息的处理
	 * @author fxq
	 *
	 */
	public class ItemMQController {

		private static final ObjectMapper MAPPER = new ObjectMapper();
		@Autowired
		private JedisClient jedisClient;
		@Value("${REDIS_ITEM_KEY}")
		private String REDIS_ITEM_KEY;
		@Value("${ITEM_BASE_INFO_KEY}")
		private String ITEM_BASE_INFO_KEY;
		
		public void execute(String msg)
		{
			//解析数据
			JsonNode jsonNode;
			try {
				jsonNode = MAPPER.readTree(msg);
				Long itemId = jsonNode.get("itemId").asLong();
				//删除Redis中的缓存数据;
				//jedisClient.del(REDIS_ITEM_KEY + ":" + itemId + ":"+ITEM_BASE_INFO_KEY);
				Set keys = jedisClient.keys(REDIS_ITEM_KEY);
				Iterator iterator = keys.iterator();
				while (iterator.hasNext()) {
					String key = (String) iterator.next();
					System.out.println(key);
					jedisClient.del(key);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} 	
		}
	}

交换器和队列绑定

  【RabbitMQ】RabbitMQ与Spring整合_第1张图片


  前台系统和后台系统,不直接调用,使用消息进行通信,实现解耦合与异步通信。


你可能感兴趣的:(☀,架构设计,RabbitMq,RabbiMQ,Redis)