activemq和spring的整合应用

应用场景:当我们给商品添加一条记录后,需要把商品的信息同步到索引库。

1:配置producer,用jmsTemplate去发送消息(queueDestination这个名称需要和监听中配置对应

      <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->

      <beanid="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">

            <property name="brokerURL" value="tcp://192.168.25.168:61616" />

      </bean>

      <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->

      <beanid="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>

2:当商品添加完成后发送一个TextMessage,包含一个商品id。,模板和发送目的地用spring注入的方式

@Autowired

private JmsTemplate  jmsTemplate;

@Autowired

private Destination topicDestination;

@Override

      public TaotaoResult addItem(TbItem item, String desc) {

            // 1、生成商品id

            finallongitemId = IDUtils.genItemId();

            // 2、补全TbItem对象的属性

            item.setId(itemId);

            //商品状态,1-正常,2-下架,3-删除

            item.setStatus((byte) 1);

            Date date = new Date();

            item.setCreated(date);

            item.setUpdated(date);

            // 3、向商品表插入数据

            itemMapper.insert(item);

            // 4、创建一个TbItemDesc对象

            TbItemDesc itemDesc = new TbItemDesc();

            // 5、补全TbItemDesc的属性

            itemDesc.setItemId(itemId);

            itemDesc.setItemDesc(desc);

            itemDesc.setCreated(date);

            itemDesc.setUpdated(date);

            // 6、向商品描述表插入数据

            itemDescMapper.insert(itemDesc);

            //发送一个商品添加消息

            jmsTemplate.send(topicDestination, new MessageCreator() {

                 

                  @Override

                  public Message createMessage(Session session) throws JMSException {

                        TextMessage textMessage = session.createTextMessage(itemId + "");

                        returntextMessage;

                  }

            });

            // 7、TaotaoResult.ok()

            return TaotaoResult.ok();

      }

3:写监听,配置监听

publicclassItemChangeListener implements MessageListener {  

   @Autowired

      privateSearchItemServiceImpl searchItemServiceImpl;

      @Override

      publicvoid onMessage(Message message) {

            try {

                  TextMessage textMessage = null;

                  Long itemId = null;

                  //取商品id

                  if (messageinstanceof TextMessage) {

                        textMessage = (TextMessage) message;

                        itemId = Long.parseLong(textMessage.getText());

                  }

                  //向索引库添加文档

                  searchItemServiceImpl.addDocument(itemId);  

            } catch (Exception e) {

                  e.printStackTrace();

            }

      } 

}

<!-- 真正可以产生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>
<!--这个是主题目的地,一对多的 -->
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">

<constructor-arg value="item-add-topic" />
</bean>

<!-- 配置消息监听器 -->
<bean id="htmlGenListener" class="com.taotao.item.listener.HtmlGenListener"/>
<!-- 配置监听容器 -->
<!-- 消息监听容器 -->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="topicDestination" />
<property name="messageListener" ref="htmlGenListener" />
</bean>
</beans>

3;serivce层

public TaotaoResult addDocument(longitemId) throws Exception {

            // 1、根据商品id查询商品信息。

            SearchItem searchItem = searchItemMapper.getItemById(itemId);

            // 2、创建一SolrInputDocument对象。

            SolrInputDocument document = new SolrInputDocument();

            // 3、使用SolrServer对象写入索引库。

            document.addField("id", searchItem.getId());

            document.addField("item_title", searchItem.getTitle());

            document.addField("item_sell_point", searchItem.getSell_point());

            document.addField("item_price", searchItem.getPrice());

            document.addField("item_image", searchItem.getImage());

            document.addField("item_category_name", searchItem.getCategory_name());

            document.addField("item_desc", searchItem.getItem_desc());

            // 5、向索引库中添加文档。

            solrServer.add(document);

            solrServer.commit();

            // 4、返回成功,返回TaotaoResult

            return TaotaoResult.ok();


猜你喜欢

转载自blog.csdn.net/qq_36881106/article/details/80661893
今日推荐