56分布式电商项目 - ActiveMQ 实现运营商后台与搜索服务的零耦合(一)

简介: 56分布式电商项目 - ActiveMQ 实现运营商后台与搜索服务的零耦合(一)

运用消息中间件ActiveMQ实现运营商后台与搜索服务的零耦合。运营商执行商品审后,向 ActiveMQ 发送消息(SKU 列表),搜索服务从 ActiveMQ 接收到消息并导入到 solr 索引库。

消息生产者(运营商后台)

1)pinyougou-manager-web 的 pom.xml,引入依赖:

<dependency> 
  <groupId>org.apache.activemq</groupId> 
  <artifactId>activemq-client</artifactId> 
  <version>5.13.4</version>
</dependency>

2)pinyougou-sellergoods-service 工程添加 spring-activemq.xml内容如下:

3)代码实现:

@Autowired
private Destination queueSolrDestination;//用于发送 solr 导入的消息
@Autowired
private JmsTemplate jmsTemplate;
@RequestMapping("/updateStatus")
public Result updateStatus(Long[] ids,String status){
  try {
    goodsService.updateStatus(ids, status);
    //按照 SPU ID 查询 SKU 列表(状态为 1)
    if(status.equals("1")){
    //审核通过List<TbItem> 
    itemList = goodsService.findItemListByGoodsIdandStatus(ids, status);//调用搜索接口实现数据批量导入
    if(itemList.size()>0){
    final String jsonString = JSON.toJSONString(itemList);
    jmsTemplate.send(queueSolrDestination, new MessageCreator() {
    @Override
    public Message createMessage(Session session) throws JMSException {
    return session.createTextMessage(jsonString);
    }
    });
    }else{
    System.out.println("没有明细数据");
    }
     }return new Result(true, "修改状态成功"); 
     } catch (Exception e) {
     e.printStackTrace();return new Result(false, "修改状态失败");
     }
      }

消息消费者(搜索服务)

1)修改 pinyougou-search-service ,在 pom.xml 中添加 activemq 依赖

<dependency> 
  <groupId>org.apache.activemq</groupId> 
  <artifactId>activemq-client</artifactId> 
  <version>5.13.4</version>
</dependency>

2)添加 spring 配置文件 applicationContext-jms-consumer.xml

<!-- 真正可以产生 Connection 的 ConnectionFactory,由对应的 JMS 服务厂商提供--> 
<bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory"> 
  <property name="brokerURL" value="tcp://192.168.25.135:61616"/>
</bean>
<!-- Spring 用于管理真正的 ConnectionFactory 的 ConnectionFactory -->
 <bean id="connectionFactory"class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>
  </bean>
  <!--这个是队列目的地,点对点的 文本信息--> 
  <bean id="queueSolrDestination"class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg value="pinyougou_queue_solr"/>
  </bean>
<!-- 消息监听容器 --> 
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="queueSolrDestination" />    <property name="messageListener" ref="itemSearchListener" /
   </bean>

3) 代码实现

@Component
public class ItemSearchListener implements MessageListener{
@Autowired
private ItemSearchService itemSearchService;
@Override
public void onMessage(Message message) {
  System.out.println("监听接收到消息...");
  try {
      TextMessage textMessage=(TextMessage)message;
      String text = textMessage.getText();
      List<TbItem> list = JSON.parseArray(text,TbItem.class);
      for(TbItem item:list){
      System.out.println(item.getId()+" "+item.getTitle());
      Map specMap= JSON.parseObject(item.getSpec());//将 spec 字段中的 json
      字符串转换为 map
      item.setSpecMap(specMap);//给带注解的字段赋值
    }
    itemSearchService.importList(list);//导入
    System.out.println("成功导入到索引库");
  } catch (Exception e) {
    e.printStackTrace();
  } 
} 
}


目录
相关文章
|
19天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
32 2
|
3月前
|
监控 负载均衡 Dubbo
|
2月前
|
消息中间件 算法 Java
【亿级数据专题】「分布式服务框架」 盘点本年度我们探索服务的保障容量的三大关键方案实现
【亿级数据专题】「分布式服务框架」 盘点本年度我们探索服务的保障容量的三大关键方案实现
187 0
|
4月前
|
Dubbo Java 应用服务中间件
Spring Boot Dubbo 构建分布式服务
Spring Boot Dubbo 构建分布式服务
49 0
|
4月前
|
分布式计算 Ubuntu Hadoop
百度搜索:蓝易云【Ubuntu搭建全分布式Hadoop】
请注意,以上只是概述,并不包含详细的步骤和指令。搭建全分布式Hadoop是一个复杂的过程,需要对Hadoop的架构和配置有深入的理解,并熟悉Linux系统管理。建议在搭建全分布式Hadoop之前,先学习相关知识并查阅官方文档和教程,以确保正确搭建和配置Hadoop集群。
27 0
|
4月前
|
消息中间件 算法 Java
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的保障容量的三大关键方案实现
尽管经过了上一篇文章 《【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案实现》有了低延迟的优化保障,消息引擎仍需精心规划其容量。为了提供无与伦比的流畅体验,消息引擎必须实施有效的容量管理策略。
53 2
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的保障容量的三大关键方案实现
|
3月前
|
消息中间件 存储 负载均衡
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的HA高可用解决方案
昔之善战者,先为不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能为不可胜,不能使敌之必可胜。故曰:胜可知,而不可为。
84 2
【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的HA高可用解决方案
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
170 0
|
3月前
|
存储 Oracle 关系型数据库
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)
46 0
|
5天前
使用JWT的服务分布式部署之后报错:JWT Check Failure:
使用JWT的服务分布式部署之后报错:JWT Check Failure:
16 1