OkHttps
OkHttps 是 OkHttp 的輕量封裝包隙疚。和 Retrofit 相比财破,它更加的開箱即用嵌灰,并且 API 更加自然和語義化孝扛。它用起來很優(yōu)美呈队,有點(diǎn)像 RxJava 卻比 RxJava 更簡單有勾。
中文網(wǎng)站:http://okhttps.ejlchina.com/
項(xiàng)目地址
Gitee:https://gitee.com/ejlchina-zhxu/okhttps
GitHub:https://github.com/ejlchina/okhttps
Stomp
項(xiàng)目 OkHttps Stomp 基于 OkHttps 的 WebSocket 功能實(shí)現(xiàn)了一個(gè)非常輕量(僅 13KB)的 Stomp 客戶端協(xié)議绪穆,它可以讓你輕松實(shí)現(xiàn) 廣播發(fā)布與訂閱 和 隊(duì)列發(fā)布與訂閱 的客戶端功能刁绒。
添加依賴
要開啟 Stomp 功能,需要添加以下依賴:
Maven
<dependency>
<groupId>com.ejlchina</groupId>
<artifactId>okhttps-stomp</artifactId>
<version>2.5.0</version>
</dependency>
Gradle
implementation 'com.ejlchina:okhttps-stomp:2.5.0'
構(gòu)建 Stomp 實(shí)例
類Stomp
提供靜態(tài)方法over
來構(gòu)建Stomp
實(shí)例:
-
over(WebSocketTask task)
基于 OkHttps 的 WebSocket 構(gòu)建一個(gè) Stomp 實(shí)例坊罢,并自動(dòng)確認(rèn)消息 -
over(WebSocketTask task, boolean autoAck)
構(gòu)建一個(gè) Stomp 實(shí)例续担,并可指定是否自動(dòng)確認(rèn)消息
例如:
// 使用一個(gè) Websocket 連接構(gòu)建一個(gè) Stomp 實(shí)例,同時(shí)設(shè)置心跳間隔為 20 秒
Stomp stomp = Stomp.over(OkHttps.webSocket("wss://...").heatbeat(20, 20));
以上代碼構(gòu)建了一個(gè)簡單的 Stomp 客戶端活孩,并默認(rèn)在收到消息時(shí)會(huì)自動(dòng)確認(rèn)物遇,如果需要收到確認(rèn),可以使用下面的方式:
Stomp stomp = Stomp.over(
OkHttps.webSocket("wss://...").heatbeat(20, 20),
false // 參數(shù)設(shè)置 autoAck 為 false,將需要手動(dòng)確認(rèn)消息
);
連接 Stomp 服務(wù)
得到一個(gè)Stomp
實(shí)例后询兴,可使用以下兩個(gè)方法連接 Stomp 服務(wù)器:
-
connect()
直接連接 Stomp 服務(wù)器 -
connect(List<Header> headers)
攜帶一些 Stomp 頭信息連接 Stomp 服務(wù)器
例如:
stomp.connect();
如果服務(wù)器在連接時(shí)需要指令一些額外信息乃沙,比如連接 RabbitMQ 時(shí)需要指定login
、passcode
和 vhost
:
List<Header> headers = new ArrayList<>();
headers.add(new Header("login", "username"));
headers.add(new Header("passcode", "xxxxxxx"));
headers.add(new Header("host", "your_vhost"));
stomp.connect(headers);
連接狀態(tài)監(jiān)聽
Stomp.over(OkHttps.webSocket("wss://...").heatbeat(20, 20))
.setOnConnected(stomp -> {
// 服務(wù)器連接成功回調(diào)
})
.setOnDisconnected(close -> {
// 連接已斷開回調(diào)
})
.setOnError(msg -> {
// 錯(cuò)誤監(jiān)聽(v2.4.1 新增)
// 處理服務(wù)器發(fā)出的 ERROR 幀
})
.connect();
消息訂閱與退訂
訂閱廣播
stomp.topic("/your-topic", (Message msg) -> {
// 得到消息負(fù)載
String payload = msg.getPayload();
// 如果需要手動(dòng)確認(rèn)消息,調(diào)用此方法確認(rèn)
stomp.ack(msg)
});
退訂廣播
stomp.untopic("/your-topic");
訂閱隊(duì)列
stomp.queue("/your-queue", (Message msg) -> {
// 得到消息負(fù)載
String payload = msg.getPayload();
// 如果需要手動(dòng)確認(rèn)消息,調(diào)用此方法確認(rèn)
stomp.ack(msg)
});
退訂隊(duì)列
stomp.unqueue("/your-queue");
發(fā)送消息
// 發(fā)送到廣播
stomp.sendTo("/topic/your-topic", "Hello World");
// 發(fā)送到隊(duì)列
stomp.sendTo("/queue/your-queue", "Hello World");
斷開服務(wù)
stomp.disconnect();