淘淘商城24_ActiveMq消息队列02_activeMq与spring的整合

一、添加依赖

<!-- activeMQ -->
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-all</artifactId>
		</dependency>

二、配置文件

applicationContext-activeMq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">


	<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://192.168.1.104:61616" />
	</bean>
	<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
	<bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory">
		<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
		<property name="targetConnectionFactory" ref="targetConnectionFactory" />
	</bean>
	
	<!-- 配置生产者 -->
	<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
		<property name="connectionFactory" ref="connectionFactory" />
	</bean>
	
	<!--这个是队列目的地,点对点的 -->
	<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg>
            <!-- 发送消息的名称 -->
			<value>spring-queue</value>
		</constructor-arg>
	</bean>
	
	<!--这个是主题目的地,一对多的 -->
	<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="topic" />
	</bean>
	
	<!-- 接收消息 -->
	<!-- 配置监听器 -->
	<bean id="myMessageListener" class="com.taotao.listener.MyMessageListener" />
	<!-- 消息监听容器 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="queueDestination" />
		<property name="messageListener" ref="myMessageListener" />
	</bean>
	
</beans>

三、代码测试

1. 发送消息

第一步:初始化一个spring容器

第二步:从容器中获得JMSTemplate对象。

第三步:从容器中获得一个Destination对象

第四步:使用JMSTemplate对象发送消息,需要知道Destination

@Test
	public void testQueueProducer() throws Exception {
		// 第一步:初始化一个spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activeMq.xml");
		// 第二步:从容器中获得JMSTemplate对象。
		JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
		// 第三步:从容器中获得一个Destination对象
		Queue queue = (Queue) applicationContext.getBean("queueDestination");
		// 第四步:使用JMSTemplate对象发送消息,需要知道Destination
		jmsTemplate.send(queue, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				TextMessage textMessage = session.createTextMessage("spring activemq testsss");
				return textMessage;
			}
		});
	}

2. 接收消息

第一步:把Activemq相关的jar包添加到工程中

第二步:创建一个MessageListener的实现类。

MessageListener.java

public class MyMessageListener implements MessageListener {
	@Override
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			//获取消息内容
			String text = textMessage.getText();
			System.out.println(text);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}
@Test
	public void testQueueConsumer() throws Exception {
		//初始化spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activeMq.xml");
		//等待
		System.in.read();
	}

3、测试

先运行consumer代码,运行起来以后,再运行”testQueueProducers”这个程序,就可以看到运行结果了

四、在项目中的应用-----数据库与索引库的同步

1. 思想:

taotao-manager工程中添加 一个商品,然后会将这个商品的itemId发送给activeMq,Mq接收到这个itemId,然后将itemId再次发送给taotao-search工程,

2. 生产者taotao-manager-service ,依赖和配置文件本文开始已添加

商品添加功能

/**
	 * 添加商品信息
	 */
	@Override
	public TaotaoResult saveItem(TbItem tbItem, String desc,String paramData) {
		//数据补全
		tbItem.setCreated(new Date());
		tbItem.setUpdated(new Date());
		tbItem.setStatus((byte)1);//'商品状态,1-正常,2-下架,3-删除
		final long itemId = IDUtils.genItemId();//生成随机id
		tbItem.setId(itemId);
		itemMapper.saveItem(tbItem);
		
		TaotaoResult result = saveItemDesc(itemId, desc);
		if (result.getStatus()!=200) {
			try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		TaotaoResult  itemResult = saveItemParamItem(itemId, paramData);
		if (itemResult.getStatus()!=200) {
			try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//向activeMq发送消息,将商品的id发送给activeMq
		jmsTemplate.send(destination, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				TextMessage textMessage = session.createTextMessage(itemId+"");//发送的消息
				return textMessage;
			}
		});
		
		return TaotaoResult.ok();
	}

3. 消费者taotao-search

3.1. 配置文件 applicationContext-activeMq.xml(taotao-search-service)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">


   <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://192.168.1.101:61616" />
	</bean>
	
	<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
	<bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory">
		<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
		<property name="targetConnectionFactory" ref="targetConnectionFactory" />
	</bean>
	
	<!--这个是队列目的地,点对点的 -->
	<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg>
			<value>spring-queue</value>
		</constructor-arg>
	</bean>
	
	<!--这个是主题目的地,一对多的 -->
	<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="item-change-topic" />
	</bean>
	
	<!-- 配置监听器 -->
	<bean id="myMessageListener" class="com.taotao.search.listener.MyMessageListener" />
	<!-- 消息监听容器 -->
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="topicDestination" />
		<property name="messageListener" ref="myMessageListener" />
	</bean>

</beans>

3.2. pom添加依赖taotao-search-service

<!-- activeMQ -->
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-all</artifactId>
            </dependency>

3.3. Mapper层

3.4 SearchItemMapper.xml

3.5 Service层SearchItemService.java

3.6 SearchItemServiceImpl.java

/**
	 * 添加商品到索引库
	 */
	@Override
	public TaotaoResult addDocument(long itemId) {
		try {
			//1.查询出taotao-manager添加的商品
			SearchItem searchItem = searchItemMapper.getSearchItemById(itemId);
			//2.创建一个SolrInputDocument对象
			SolrInputDocument document = new SolrInputDocument();
			//3.将查询到的数据添加到索引库
			//根据索引库域的定义,将字段写入到索引库
			document.setField("id", searchItem.getId());
			document.setField("item_title", searchItem.getTitle());
			document.setField("item_category_name", searchItem.getCatName());
			document.setField("item_image", searchItem.getImage());
			document.setField("item_desc", searchItem.getItem_desc());
			document.setField("item_price", searchItem.getPrice());
			document.setField("item_sell_point", searchItem.getSell_point());
			
			solrServer.add(document);
			solrServer.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return TaotaoResult.ok();
	}

3.7 配置监听 MyMessageListener.java

创建一个监听类

package com.taotao.search.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

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

import com.taotao.search.service.SearchItemService;

/**
 * 配置一个监听类
 * @author fengjinzhu
 *
 */
public class MyMessageListener implements MessageListener {

	@Autowired
	private SearchItemService searchItemService;
	
	@Override
	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			//获取消息内容,生产者发送的消息内容
			String itemId = textMessage.getText();
			//等待一秒钟
			Thread.sleep(1000);
			searchItemService.addDocument(Long.valueOf(itemId));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	

}

猜你喜欢

转载自blog.csdn.net/fjz_lihuapiaoxiang/article/details/85257135
今日推荐