Java之品优购课程讲义_day13(5)

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

<dependency>

<groupId>com.pinyougou</groupId>

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

<version>0.0.3-SNAPSHOT</version>

</dependency>
GoodsController.java 中删除调用搜索服务接口的相关代码

//itemSearchService.deleteByGoodsIds(Arrays.asList(ids));

//@Reference

//private  ItemSearchService  itemSearchService;

//itemSearchService.importList(itemList);
4.1.1 准备工作
(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 工程添加 applicationContext-jms-producer.xml

改名为 spring-activemq.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">
<!--  目标 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

<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

@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 依赖

<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>
4.3.1 代码实现
在 pinyougou-search-service 的 com.pinyougou.search.service.impl 新增监听类

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

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值