商品审核-导入 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();
}
}
}
|