最近項(xiàng)目中遇到一個(gè)問題,就是用android消費(fèi)ActiveMQ中的消息,并且對(duì)還沒有被消費(fèi)的消息持久化,等到Android客戶端再次連接的時(shí)候评肆,可訂閱到還未處理的消息,在處理這個(gè)問題的時(shí)候我遇到了一些麻煩非区。
問題一
遇到的第一個(gè)麻煩是Android客戶端不可以直接使用ActiveMQ的原生客戶端來從ActiveMQ中訂閱消息瓜挽。
其原因是,android的sdk中不支持j2ee相關(guān)jar包和絕大多數(shù)的javax.*包的東西類庫征绸。
我也腦袋熱過久橙,直接將jdk的rt.jar搞到安卓項(xiàng)目里,但是最后報(bào)出錯(cuò)誤信息管怠,證明這樣子做是很蠢的-_-!剥汤。
那么不能直接在Android上是使用ActiveMQ的原生客戶端來發(fā)布訂閱消息,就一點(diǎn)辦法都沒有了嗎排惨?答案肯定是不是這樣子的吭敢,ActiveMQ的發(fā)布訂閱模式支持MQTT協(xié)議,所以可以改用MQTT在ActiveMQ中發(fā)布訂閱消息暮芭,想了解MQTT協(xié)議是啥鹿驼,就自己點(diǎn)進(jìn)去看看欲低,這里就不多介紹了。
問題二
MQTT的協(xié)議的消息持久化畜晰,只是支持持久化最后一條未被消費(fèi)的消息砾莱,但是這樣和我的需求又不相符合。
我的解決方法:
將ActiveMQ的jms消息轉(zhuǎn)發(fā)到MQTT的主題上凄鼻,android終端訂閱MQTT消息主題腊瑟,把消息持久化放到ActiveMQ的jms主題中,我做了一個(gè)適配來解決這個(gè)問題块蚌。
適配邏輯圖:
實(shí)現(xiàn)邏輯圖
ActiveMQ適配器代碼實(shí)現(xiàn)地以及android-sdk:代碼地址
ActiveMQ適配器android例子:代碼地址