1. 程式人生 > >Java之品優購課程講義_day13(5)

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

}

}