如今的互聯網時代,異步消息和緩存幾乎是互聯網項目的剛需。這次給大家帶來一款異步消息開發神器:easy-asyn。接下來的幾篇文檔都是在介紹easy-asyn的使用。下面,我們將圍繞JMS和ActiveMQ的使用來介紹easy-asyn基礎功能。
1. 是什麼
easy-asyn是一個通用的一異步消息開發組件,比較像是日誌框架裏的slf4j,你可以把easy-asyn理解爲消息中間件領域的門面框架。
2. 使用場景
如果引入easy-asyn,當你的項目需要從一種MQ遷移到另一種MQ,或者Redis,幾乎可以零成本切換到新的異步消息組件。
3. 怎麼用?
3.1 maven引入(最新版本)
<dependency>
<groupId>io.github.xiaoyudeguang</groupId>
<artifactId>easy-asyn</artifactId>
<version>最新版本</version>
</dependency>
3.2 基於JMS的demo(必須在同一個服務內)
a. 生產者
package com.zlyx.test.asyn;
import org.springframework.context.ApplicationContext;
import com.zlyx.easy.asyn.utils.MsgUtils;
import com.zlyx.easy.core.annotations.SpringBean;
import com.zlyx.easy.core.event.IHandlerOnRefreshed;
@SpringBean(todo = { "異步消息發送" })
public class AsynMsgSender implements IHandlerOnRefreshed {
@Override
public void doOnRefreshed(ApplicationContext context) throws Exception {
MsgUtils.doTopic("easy-asyn", "MQ異步消息測試@topic");
MsgUtils.doQuque("easy-asyn", "MQ異步消息測試@queue");
}
}
b. 消費者
package com.zlyx.test.asyn;
import com.zlyx.easy.asyn.annotations.MsgCustomer;
import com.zlyx.easy.asyn.interfaces.AsynMsgCustomer;
import com.zlyx.easy.core.utils.LogUtils;
@MsgCustomer(channels = { "easy-asyn", "easy-redis" })
public class AsynMsgListener implements AsynMsgCustomer {
@Override
public void subscribe(String channel, Object msgBody) {
LogUtils.info(msgBody);
}
}
c. 運行結果
2019-09-07 21:11:15.826 INFO 4036 --- [ restartedMain] o.apache.activemq.broker.BrokerService : Using Persistence Adapter: MemoryPersistenceAdapter
2019-09-07 21:11:15.839 INFO 4036 --- [ JMX connector] o.a.a.broker.jmx.ManagementContext : JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
2019-09-07 21:11:15.966 INFO 4036 --- [ restartedMain] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.3 (localhost, ID:S43O7C5QVJLNRJZ-63922-1567861875834-0:1) is starting
2019-09-07 21:11:15.971 INFO 4036 --- [ restartedMain] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.3 (localhost, ID:S43O7C5QVJLNRJZ-63922-1567861875834-0:1) started
2019-09-07 21:11:15.971 INFO 4036 --- [ restartedMain] o.apache.activemq.broker.BrokerService : For help or more information please see: http://activemq.apache.org
2019-09-07 21:11:15.975 WARN 4036 --- [ restartedMain] o.apache.activemq.broker.BrokerService : Temporary Store limit is 51200 mb (current store usage is 0 mb). The data directory: C:\Users\Administrator\Desktop\test-job only has 25947 mb of usable space. - resetting to maximum available disk space: 25947 mb
2019-09-07 21:11:16.013 INFO 4036 --- [ restartedMain] o.a.activemq.broker.TransportConnector : Connector vm://localhost started
2019-09-07 21:11:16.213 INFO 4036 --- [enerContainer-1] com.zlyx.test.asyn.AsynMsgListener : MQ異步消息測試@topic
2019-09-07 21:11:16.220 INFO 4036 --- [enerContainer-1] com.zlyx.test.asyn.AsynMsgListener : MQ異步消息測試@queue
可以看到,我們拿到了我們想要的結果。這是easy-asyn的一個簡單demo,默認情況下通過JMS來實現消息隊列,你不需要做任何配置。但是這種方式的侷限性在於只適用於生產者和消費者在同一個服務上的情況。
3.3 ActiveMQ(適用於不同服務間)
我們知道,其實ActiveMQ是基於JMS的標準實現的,兩者幾乎可以無縫銜接。去官網下載和解壓的教程百度一大堆,不再介紹。我們重點關注ActiveMQ在SpringBoot中的application.properties文件裏的配置:
spring.activemq.broker-url: tcp://localhost:61616
spring.activemq.user: admin
spring.activemq.password: admin
spring.activemq.user: admin
spring.activemq.password: admin
spring.activemq.in-memory=false
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=5
spring.activemq.pool.idle-timeout=30000
spring.activemq.pool.expiry-timeout=0
加入這個配置後,重新啓動項目,控制檯輸入如下內容:
2019-09-07 21:26:49.209 INFO 9696 --- [enerContainer-1] com.zlyx.test.asyn.AsynMsgListener : MQ異步消息測試@queue
2019-09-07 21:26:49.208 INFO 9696 --- [enerContainer-1] com.zlyx.test.asyn.AsynMsgListener : MQ異步消息測試@topic
明顯可以看到控制檯打印也不一樣了。如果沒有引入mq,會用MemoryPersistenceAdapter來實現jms通信。