Vertx基于EventBus發(fā)送接受自定義對(duì)象
先看官方文檔步驟:
需要一個(gè)編解碼器,看源碼:
可見內(nèi)置了需要數(shù)據(jù)類型的實(shí)現(xiàn),所以發(fā)送其他消息可以發(fā)送,但是如果發(fā)送自定義對(duì)象就需要自己實(shí)現(xiàn)編解碼邏輯了
一 自定義編解碼器
/** * 自定義對(duì)象編解碼器,兩個(gè)類型可用于消息轉(zhuǎn)換,即發(fā)送對(duì)象轉(zhuǎn)換為接受需要的對(duì)象 */ public class CustomizeMessageCodec implements MessageCodec<OrderMessage, OrderMessage> { /** * 將消息實(shí)體封裝到Buffer用于傳輸 * 實(shí)現(xiàn)方式:使用對(duì)象流從對(duì)象中獲取Byte數(shù)組然后追加到Buffer */ @Override public void encodeToWire(Buffer buffer, OrderMessage orderMessage) { final ByteArrayOutputStream b = new ByteArrayOutputStream(); try (ObjectOutputStream o = new ObjectOutputStream(b)){ o.writeObject(orderMessage); o.close(); buffer.appendBytes(b.toByteArray()); } catch (IOException e) { e.printStackTrace(); } } //從Buffer中獲取消息對(duì)象 @Override public OrderMessage decodeFromWire(int pos, Buffer buffer) { final ByteArrayInputStream b = new ByteArrayInputStream(buffer.getBytes()); OrderMessage msg = null; try (ObjectInputStream o = new ObjectInputStream(b)){ msg = (OrderMessage) o.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return msg; } //消息轉(zhuǎn)換 @Override public OrderMessage transform(OrderMessage orderMessage) { System.out.println("消息轉(zhuǎn)換---");//可對(duì)接受消息進(jìn)行轉(zhuǎn)換,比如轉(zhuǎn)換成另一個(gè)對(duì)象等 orderMessage.setName("姚振"); return orderMessage; } @Override public String name() { return "myCodec"; } //識(shí)別是否是用戶自定義編解碼器,通常為-1 @Override public byte systemCodecID() { return -1; } public static MessageCodec create() { return new CustomizeMessageCodec(); } }
這里有一個(gè)點(diǎn)要注意,nam方法是必須的,且發(fā)送的時(shí)候一定要指明name
二 發(fā)送消息編寫
public class ProducerVerticle extends AbstractVerticle { @Override public void start() throws Exception { EventBus eventBus = vertx.eventBus(); //發(fā)布消息(群發(fā)) eventBus.publish("com.hou", "群發(fā)祝福!"); //發(fā)送消息(單發(fā)),只會(huì)發(fā)送注冊(cè)此地址的一個(gè),采用不嚴(yán)格的輪詢算法選擇 DeliveryOptions options = new DeliveryOptions();//設(shè)置消息頭等 options.addHeader("some-header", "some-value"); eventBus.send("com.hou", "單發(fā)消息",options,ar->{ if(ar.succeeded()) System.out.println("收到消費(fèi)者確認(rèn)信息:"+ar.result().body()); }); //發(fā)送自定義對(duì)象,需要編解碼器 eventBus.registerCodec(CustomizeMessageCodec.create());//注冊(cè)編碼器 DeliveryOptions options1 = new DeliveryOptions().setCodecName("myCodec");//必須指定名字 OrderMessage orderMessage = new OrderMessage(); orderMessage.setName("侯征"); eventBus.send("com.hou", orderMessage, options1); } }
三 接受消息Verticle編寫
public class ConsumerVerticle extends AbstractVerticle { @Override public void start() throws Exception { //每個(gè)Vertx實(shí)例默認(rèn)是單例 EventBus eb = vertx.eventBus(); //注冊(cè)處理器,消費(fèi)com.hou發(fā)送的消息 MessageConsumer<Object> consumer = eb.consumer("com.hou");//訂閱地址 consumer.handler(message -> {//消息處理器 if(message.body() instanceof OrderMessage){ System.out.println("接受到對(duì)象: " + ((OrderMessage) message.body()).getName()); } System.out.println("我是普通消費(fèi)者: " + message.body()); message.reply("收到了!"); // 回復(fù)生產(chǎn)者,send才能接受 }).completionHandler(res -> {//注冊(cè)完成后通知事件,適用于集群中比較慢的情況下 System.out.println("注冊(cè)處理器結(jié)果"+res.succeeded()); }); //撤銷處理器 //consumer.unregister(); } }
四 注冊(cè)部署Verticcle
vertx.deployVerticle(ConsumerVerticle.class.getName()); TimeUnit.SECONDS.sleep(1); vertx.deployVerticle(ProducerVerticle.class.getName());
五 測(cè)試
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Git恢復(fù)之前版本的兩種方法reset、revert(圖文詳解)
- Git撤銷&回滾操作(git reset 和 get revert)
- IDEA連接mysql又報(bào)錯(cuò)!Server returns invalid timezone. Go to tab and set serverTimezone prope的問題
- PIL包中Image模塊的convert()函數(shù)的具體使用
- Tensorflow 模型轉(zhuǎn)換 .pb convert to .lite實(shí)例
- MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實(shí)現(xiàn)類型轉(zhuǎn)換的講解
- SpringBoot基于HttpMessageConverter實(shí)現(xiàn)全局日期格式化
- 使用IDEA和Gradle構(gòu)建Vertx項(xiàng)目(圖文步驟)
- Vert.x運(yùn)行環(huán)境搭建流程圖解
相關(guān)文章
vue中手機(jī)號(hào),郵箱正則驗(yàn)證以及60s發(fā)送驗(yàn)證碼的實(shí)例
下面小編就為大家分享一篇vue中手機(jī)號(hào),郵箱正則驗(yàn)證以及60s發(fā)送驗(yàn)證碼的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03Vue3系列之effect和ReactiveEffect?track?trigger源碼解析
這篇文章主要為大家介紹了Vue3系列之effect和ReactiveEffect?track?trigger源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10解決vue項(xiàng)目nginx部署到非根目錄下刷新空白的問題
今天小編就為大家分享一篇解決vue項(xiàng)目nginx部署到非根目錄下刷新空白的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue3+ts數(shù)組去重方及reactive/ref響應(yīng)式顯示流程分析
這篇文章主要介紹了vue3+ts數(shù)組去重方法-reactive/ref響應(yīng)式顯示,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Vue PC端實(shí)現(xiàn)掃碼登錄功能示例代碼
目前大多數(shù)PC端應(yīng)用都有配套的移動(dòng)端APP,如微信,淘寶等,通過使用手機(jī)APP上的掃一掃功能去掃頁面二維碼圖片進(jìn)行登錄,使得用戶登錄操作更方便,安全,快捷,這篇文章主要介紹了Vue PC端如何實(shí)現(xiàn)掃碼登錄功能,需要的朋友可以參考下2023-01-01vue前臺(tái)顯示500和405錯(cuò)誤的解決(springboot為后臺(tái))
這篇文章主要介紹了vue前臺(tái)顯示500和405錯(cuò)誤的解決(springboot為后臺(tái)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07