应用activeMQ消息中间件同步索引库
mq是一个消息服务器;
安装包内置了tomcat,直接登录访问,登录:http://ip:8161/admin/ (相当于dubbo的moniter监控中心) admin admin
传统串行化,并行化:
mq消息服务器集中管理消息:
1)点对点:
异步接收消息(监听模式):
2)订阅模式:
必须使用监听模式(异步);
Spring整合mq:
配置生产者:
1 <!-- 创建acitiveMQ消息服务工厂对象,把acitiveMQ消息服务器交给spring管理 --> 2 <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 3 <constructor-arg name="brokerURL" value="tcp://192.168.74.132:61616"></constructor-arg> 4 </bean> 5 6 <!-- spring jms java消息服务提供工厂对象管理mq消息 --> 7 <bean id="connectionFactory" 8 class="org.springframework.jms.connection.SingleConnectionFactory"> 9 <property name="targetConnectionFactory" ref="targetConnectionFactory"></property> 10 </bean> 11 12 <!-- spring jms 提供jms消息模版对象 发送消息 --> 13 <bean class="org.springframework.jms.core.JmsTemplate"> 14 <property name="connectionFactory" ref="connectionFactory"></property> 15 </bean> 16 17 <!-- 点对点模式空间 --> 18 <!-- <bean id="oneQueue" class="org.apache.activemq.command.ActiveMQQueue"> 19 <constructor-arg value="oneQueue"></constructor-arg> </bean> --> 20 <!-- 发布订阅模式空间 --> 21 <!-- <bean id="oneTopic" class="org.apache.activemq.command.ActiveMQTopic"> 22 <constructor-arg value="oneTopic"></constructor-arg> </bean> --> 23 <bean id="add_update_del_topic" class="org.apache.activemq.command.ActiveMQTopic"> 24 <constructor-arg value="add_update_del_topic"></constructor-arg> 25 </bean>
配置消费者:
1 <!-- 创建acitiveMQ消息服务工厂对象,把acitiveMQ消息服务器交给spring管理 --> 2 <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 3 <constructor-arg name="brokerURL" value="tcp://192.168.74.132:61616"></constructor-arg> 4 </bean> 5 6 <!-- spring jms java消息服务提供工厂对象管理mq消息 --> 7 <bean id="connectionFactory" 8 class="org.springframework.jms.connection.SingleConnectionFactory"> 9 <property name="targetConnectionFactory" ref="targetConnectionFactory"></property> 10 </bean> 11 12 <!-- 点对点模式空间 --> 13 <!-- <bean id="oneQueue" class="org.apache.activemq.command.ActiveMQQueue"> 14 <constructor-arg value="oneQueue"></constructor-arg> 15 </bean> --> 16 <!-- 发布订阅模式空间 --> 17 <!-- <bean id="oneTopic" class="org.apache.activemq.command.ActiveMQTopic"> 18 <constructor-arg value="oneTopic"></constructor-arg> 19 </bean> --> 20 <bean id="add_update_del_topic" class="org.apache.activemq.command.ActiveMQTopic"> 21 <constructor-arg value="add_update_del_topic"></constructor-arg> 22 </bean> 23 24 <!-- 创建接受消息监听器,此监听器是真实接受消息的监听器 --> 25 <bean id="myMessageListener" class="cn.e3.search.listener.IndexListener"></bean> 26 27 <!-- spring jms 提供消息监听容器接受消息. --> 28 <!-- 自动触发接受消息 --> 29 <bean 30 class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 31 <!-- 指定消息服务器地址 --> 32 <property name="connectionFactory" ref="connectionFactory"></property> 33 <!-- 指定接受消息服务器空间 --> 34 <property name="destination" ref="add_update_del_topic"></property> 35 <!-- 指定消息接受者 --> 36 <property name="messageListener" ref="myMessageListener"></property> 37 </bean>
业务分析,面向服务分布式架构SOA:
商品发生变动后,发送消息至mq:
1 jmsTemplate.send(activeMQTopic,new MessageCreator() { 2 @Override 3 public Message createMessage(Session session) throws JMSException { 4 return session.createTextMessage(""+itemId); 5 } 6 });
xml中配置监听器,在监听器类中根据接收的id查询变动后的商品,将商品索引文档写入索引库;
<!-- 创建接受消息监听器,此监听器是真实接受消息的监听器 -->
<bean id="myMessageListener" class="cn.e3.search.listener.IndexListener"></bean>
1 public void onMessage(Message message) { 2 3 try { 4 // 初始化一个商品id 5 Long itemId = null; 7 if (message instanceof TextMessage) { 8 // 接受消息 9 TextMessage m = (TextMessage) message; 10 // 获取商品id 11 itemId = Long.parseLong(m.getText()); 12 //根据商品id查询数据库新的数据 13 SearchItem searchItem = searchItemMapper.findDatabaseToSolrIndexWithID(itemId); 14 15 //把数据库数据封装到文档对象 16 SolrInputDocument doc = new SolrInputDocument(); 17 //封装文档域字段所对应值 18 //封装文档域所对应数据库查询值 19 doc.addField("id", searchItem.getId()); 20 21 //标题 22 doc.addField("item_title", searchItem.getTitle()); 23 //买点 24 doc.addField("item_sell_point", searchItem.getSell_point()); 25 //价格 26 doc.addField("item_price", searchItem.getPrice()); 27 //图片地址 28 doc.addField("item_image", searchItem.getImage()); 29 //商品类别 30 doc.addField("item_category_name", searchItem.getCategory_name()); 31 //商品描述 32 doc.addField("item_desc", searchItem.getItem_desc()); 33 34 //使用solr服务对象把索引文档对象写入索引库,实现索引库同步 35 solrServer.add(doc); 36 //提交 37 solrServer.commit(); 38 } 39 } catch (Exception e) { 40 // TODO Auto-generated catch block 41 e.printStackTrace(); 42 } 43 }