应用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     }
原文地址:https://www.cnblogs.com/mryangbo/p/8043754.html