A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

商品审核-导入 Solr 索引库
4.1 需求分析
运用消息中间件 activeMQ 实现运营商后台与搜索服务的零耦合。运营商执行商品审核后,向 activeMQ 发送消息(SKU 列表),搜索服务从 activeMQ 接收到消息并导入到 solr 索引库。
4.1 消息生产者(运营商后台)
4.1.1 解除耦合
修改 pinyougou-manager-web,移除搜索服务接口依赖:
[AppleScript] 纯文本查看 复制代码
<dependency>

<groupId>com.pinyougou</groupId>

<artifactId>pinyougou-search-interface</artifactId>

<version>0.0.3-SNAPSHOT</version>

</dependency>
GoodsController.java 中删除调用搜索服务接口的相关代码
[AppleScript] 纯文本查看 复制代码
//itemSearchService.deleteByGoodsIds(Arrays.asList(ids));



//@Reference

//private  ItemSearchService  itemSearchService;



//itemSearchService.importList(itemList);
4.1.1 准备工作
(1)修改 pinyougou-manager-web 的 pom.xml,引入依赖
[AppleScript] 纯文本查看 复制代码
<dependency>

<groupId>org.apache.activemq</groupId>

<artifactId>activemq-client</artifactId>

<version>5.13.4</version>

</dependency>
(2)pinyougou-sellergoods-service 工程添加 applicationContext-jms-producer.xml
改名为 spring-activemq.xml        内容如下:
[AppleScript] 纯文本查看 复制代码
<!--  真正可以产生 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">
<!--  目标 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="queueSolrDestination" class="org.apache.activemq.command.ActiveMQQueue">

<constructor-arg  value="pinyougou_queue_solr"/>

</bean>
(3)修改 web.xml
[AppleScript] 纯文本查看 复制代码
<context-param>


<param-name>contextConfigLocation</param-name>


<param-value>classpath:spring/spring-*.xml</param-value>


</context-param>
4.1.1 代码实现
修改 pinyougou-manager-web 工程的 GoodsController.java
[AppleScript] 纯文本查看 复制代码
@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,  "修改状态失败");

}

}
4.3 消息消费者(搜索服务)4.3.1 准备工作
(1)修改 pinyougou-search-service ,在 pom.xml 中添加 activemq 依赖
[AppleScript] 纯文本查看 复制代码
<dependency>

<groupId>org.apache.activemq</groupId>

<artifactId>activemq-client</artifactId>

<version>5.13.4</version>

</dependency>
(2)添加 spring 配置文件 applicationContext-jms-consumer.xml
[AppleScript] 纯文本查看 复制代码
<!--  真正可以产生 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>
4.3.1 代码实现
在 pinyougou-search-service 的 com.pinyougou.search.service.impl 新增监听类
[AppleScript] 纯文本查看 复制代码
@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();
}

}

}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马