Java之品優購課程講義_day13(5)
阿新 • • 發佈:2018-12-14
商品稽核-匯入 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(); } } }