• 应用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     }
  • 相关阅读:
    股指期货风声水起 股市"蛇人″给我们启示
    Goals of Distributed Application Design
    火箭股票,火箭发射(07.4.12)
    SQLAlchemy完全入门
    巧用异或
    FastAPI启用HTTPS
    错误记录:Can't connect to MySQL server on xxx
    MySQL常用命令
    就是想写点什么
    Android关于Activity class {package/class} does not exist
  • 原文地址:https://www.cnblogs.com/mryangbo/p/8043754.html
Copyright © 2020-2023  润新知