在項目中,將一些無需即時返回且耗時的操作提取出來墨叛,進(jìn)行了異步處理,
而這種異步處理的方式大大的節(jié)省了服務(wù)器的請求響應(yīng)時間扁凛,從而提高了系統(tǒng)的
吞吐量。
ActiveMQ 消息的傳遞有兩種類型:
一種是點對點的卤妒,即一個生產(chǎn)者和一個消費者一一對應(yīng)字币;
一種是發(fā)布/訂閱模式,即一個生產(chǎn)者產(chǎn)生消息并進(jìn)行發(fā)送后士复,可以由多個消費
者進(jìn)行接收翩活。
JMS
JMS 即 Java 消息服務(wù)(Java Message Service)應(yīng)用程序接口,是一個 Java 平
臺中關(guān)于面向消息中間件(MOM)的 API冗荸,用于在兩個應(yīng)用程序之間辟犀,或分布式
系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。
?StreamMessage -- Java 原始值的數(shù)據(jù)流
? MapMessage--一套名稱-值對
? TextMessage--一個字符串對象
? ObjectMessage--一個序列化的 Java 對象
? BytesMessage--一個字節(jié)的數(shù)據(jù)流
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
生產(chǎn)者spring-activemq.xml
<!--真正可以產(chǎn)生 Connection 的 ConnectionFactory 出嘹,由對應(yīng)的 JMS 服務(wù)廠商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.12.168:61616"/>
</bean>
<!--Spring 用于管理真正的 ConnectionFactory 的 ConnectionFactory-->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--Spring 提供的 JMS 工具類咬崔,它可以進(jìn)行消息發(fā)送垮斯、接收等-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!--隊列模式,在商品審核后接收的商品列表隊扰肌,隊列根據(jù)需求增加-->
<bean id="itemEsQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="item_es_queue"/>
</bean>
生產(chǎn)者控制器
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private ActiveMQQueue itemEsDeleteQueue;
private void sendMQMsg(Destination destination, Long[] ids) {
try {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setObject(ids);
return objectMessage;
}
});
} catch (Exception e) {
e.printStackTrace();
}
消費者applicationContext-activemq.xml
<!--真正可以產(chǎn)生 Connection 的 ConnectionFactory 熊杨,由對應(yīng)的 JMS 服務(wù)廠商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.12.168:61616"/>
</bean>
<!--Spring 用于管理真正的 ConnectionFactory 的 ConnectionFactory-->
<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--隊列模式,在商品審核后接收的商品列表隊-->
<bean id="itemEsQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="pinyougou_item_es_queue"/>
</bean>
<!--messageListener 實現(xiàn)類-->
<bean id="itemImportMessageListener" class="com.pinyougou.search.activemq.listener.ItemImportMessageListener"/>
<!--配置一個 jms 監(jiān)聽容器-->
<bean id="jmsImportContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="destination" ref="itemEsQueue"/>
<property name="messageListener" ref="itemImportMessageListener"/>
</bean>
消費者控制器
public class ItemDeleteMessageListener extends AbstractAdaptableMessageListener {
@Autowired
private ItemSearchService itemSearchService;
@Override
public void onMessage(Message message, Session session) throws JMSException {
ObjectMessage objectMessage = (ObjectMessage) message;
Long[] goodsIds = (Long[]) objectMessage.getObject();
itemSearchService.deleteItemByIds(goodsIds);
System.out.println("同步刪除索引庫中數(shù)據(jù)完成钻趋!");
}
}