zoukankan      html  css  js  c++  java
  • ActiveMQ整合Spring(Demo:实现添加商品更新索引的功能<原因:不建议服务之间互调>)

    发送消息

    第一步:导入相关jar包

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
      <version>5.11.2</version>
    </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.25.168: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>
    </beans>

    第三步:测试发送消息

    public class springActiveMqTest {
    
        @Test
        public void testSpringActiveMq() throws Exception {
            //初始化spring容器
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
            //从spring容器中获得JmsTemplate对象
            JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
            //从spring容器中取Destination对象
            Destination destination = (Destination) applicationContext.getBean("queueDestination");
            //使用JmsTemplate对象发送消息。
            jmsTemplate.send(destination, new MessageCreator() {
    
                @Override
                public Message createMessage(Session session) throws JMSException {
                    //创建一个消息对象并返回
                    TextMessage textMessage = session.createTextMessage("spring activemq queue message");
                    return textMessage;
                }
            });
        }
    
    }

    接收消息

    第一步:书写消息监听器

    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();
            }
        }
    
    }

    第二步:书写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://127.0.0.1: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="cn.e3mall.search.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>

    第三步:书写测试类

    @Test
    public void testQueueConsumer() throws Exception {
        //初始化spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
        //等待
        System.in.read();
    }
    

    实现添加商品更新索引的功能

    e3-manager-service层:

    添加商品后,将商品id发送到ActiveMq中;配置文件和上面的一样

        @Autowired
        private JmsTemplate jmsTemplate;
    
        @Resource/*(name = "topicDestination")*/  // 使用的是广播方式
        private Destination topicDestination;
    
        @Override
        public E3Result save(TbItem item, String desc) {
            // 保存商品基本信息
    
            // 1.通过当前日期生成商品的id
            final Long itemId = IDUtils.genItemId();
            // 2.将id设置到item中
            item.setId(itemId);
            // 3.设置zhuangtaima,1-正常,2-下架,3-删除
            item.setStatus((byte) 1);
            // 4.设置create,update
            item.setCreated(new Date());
            item.setUpdated(new Date());
            // 5.保存
            itemMapper.insert(item);
    
            // 保存商品详情
            TbItemDesc itemDesc = new TbItemDesc();
            // 1.设置id,由于是一对一关系,所以与itemid一样
            itemDesc.setItemId(itemId);
            // 2.设置其它属性
            itemDesc.setCreated(new Date());
            itemDesc.setUpdated(new Date());
            itemDesc.setItemDesc(desc);
            // 3.保存
            itemDescMapper.insert(itemDesc);
    
            // ==============实现更新索引================
    
            jmsTemplate.send(topicDestination, new MessageCreator() {
    
                @Override
                public Message createMessage(Session session) throws JMSException {
                    TextMessage textMessage = session.createTextMessage(itemId + "");
                    return textMessage;
                }
            });
    
            // ========================================
    
            // 返回ok.
            return E3Result.ok();
        }

    配置消息监听器(也是广播形式)

    <?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://127.0.0.1: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="cn.e3mall.search.listener.ItemChangeListener" />
        <!-- 消息监听容器 -->
        <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="connectionFactory" ref="connectionFactory" />
            <property name="destination" ref="topicDestination" />  <!--使用广播方式-->
            <property name="messageListener" ref="myMessageListener" /><!--监听的对象-->
        </bean>
    </beans>

    书写消息监听器

    public class ItemChangeListener implements MessageListener {
    
        @Autowired
        private SearchItemService searchItemService;
    
        @Override
        public void onMessage(Message message) {
            try {
                TextMessage textMessage = null;
                Long itemId = null;
                //取商品id
                if (message instanceof TextMessage) {
                    textMessage = (TextMessage) message;
                    itemId = Long.parseLong(textMessage.getText());
                }
                //向索引库添加文档
                searchItemService.addDocument(itemId);  // 调用service层实现添加索引
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    e3-search-service层

    @Override
        public void addDocument(Long itemId) {
            try {
                // 1、根据商品id查询商品信息
                SearchResult searchResult = itemMapper.selectItemById(itemId);
                // 创建文档对象
                SolrInputDocument document = new SolrInputDocument();
                // 向文档对象中添加域
                document.addField("id", searchResult.getId());
                document.addField("item_title", searchResult.getTitle());
                document.addField("item_sell_point", searchResult.getSell_point());
                document.addField("item_price", searchResult.getPrice());
                document.addField("item_image", searchResult.getImage());
                document.addField("item_category_name", searchResult.getCategory_name());
                // 将文档添加到索引库中
                solrServer.add(document);
                // 提交
                solrServer.commit();
            } catch (Exception ex){
                ex.printStackTrace();
            }
        }
    

    ItemMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="cn.e3mall.search.service.mapper.ItemMapper">
        <select id="selectAllItem" resultType="cn.e3mall.common.pojo.SearchResult">
          SELECT
          a.id,a.title,a.sell_point,a.price,a.image,b.name category_name
          FROM tb_item a
          INNER JOIN
          tb_item_cat b
          ON a.cid = b.id
          where a.status = '1'
        </select>
    
        <select id="selectItemById" resultType="cn.e3mall.common.pojo.SearchResult">
            SELECT
            a.id,a.title,a.sell_point,a.price,a.image,b.name category_name
            FROM tb_item a
            INNER JOIN
            tb_item_cat b
            ON a.cid = b.id
            where a.status = '1'
            and a.id = #{itemId}
        </select>
    </mapper>
    

      

  • 相关阅读:
    Linux 多线程环境下 进程线程终止函数小结
    C++:vector中的resize()函数 VS reserve()函数
    Linux进程间通信之信号量(semaphore)、消息队列(Message Queue)和共享内存(Share Memory)
    Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
    求全与求专
    wpf \silverlight 保存控件为图片
    软件版本号详解(转)
    WPF 自定义快捷键命令(Command)(转)
    WIN2003系统远程桌面多连接数设置终极大法
    程序集强命名与GAC
  • 原文地址:https://www.cnblogs.com/x54256/p/8664948.html
Copyright © 2011-2022 走看看