Vertx基于EventBus發(fā)送接受自定義對象
更新時間:2020年11月16日 11:26:50 作者:侯賽雷
這篇文章主要介紹了Vertx基于EventBus發(fā)送接受自定義對象,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
先看官方文檔步驟:
需要一個編解碼器,看源碼:
可見內置了需要數據類型的實現,所以發(fā)送其他消息可以發(fā)送,但是如果發(fā)送自定義對象就需要自己實現編解碼邏輯了
一 自定義編解碼器
/** * 自定義對象編解碼器,兩個類型可用于消息轉換,即發(fā)送對象轉換為接受需要的對象 */ public class CustomizeMessageCodec implements MessageCodec<OrderMessage, OrderMessage> { /** * 將消息實體封裝到Buffer用于傳輸 * 實現方式:使用對象流從對象中獲取Byte數組然后追加到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中獲取消息對象 @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; } //消息轉換 @Override public OrderMessage transform(OrderMessage orderMessage) { System.out.println("消息轉換---");//可對接受消息進行轉換,比如轉換成另一個對象等 orderMessage.setName("姚振"); return orderMessage; } @Override public String name() { return "myCodec"; } //識別是否是用戶自定義編解碼器,通常為-1 @Override public byte systemCodecID() { return -1; } public static MessageCodec create() { return new CustomizeMessageCodec(); } }
這里有一個點要注意,nam方法是必須的,且發(fā)送的時候一定要指明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ā)),只會發(fā)送注冊此地址的一個,采用不嚴格的輪詢算法選擇 DeliveryOptions options = new DeliveryOptions();//設置消息頭等 options.addHeader("some-header", "some-value"); eventBus.send("com.hou", "單發(fā)消息",options,ar->{ if(ar.succeeded()) System.out.println("收到消費者確認信息:"+ar.result().body()); }); //發(fā)送自定義對象,需要編解碼器 eventBus.registerCodec(CustomizeMessageCodec.create());//注冊編碼器 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 { //每個Vertx實例默認是單例 EventBus eb = vertx.eventBus(); //注冊處理器,消費com.hou發(fā)送的消息 MessageConsumer<Object> consumer = eb.consumer("com.hou");//訂閱地址 consumer.handler(message -> {//消息處理器 if(message.body() instanceof OrderMessage){ System.out.println("接受到對象: " + ((OrderMessage) message.body()).getName()); } System.out.println("我是普通消費者: " + message.body()); message.reply("收到了!"); // 回復生產者,send才能接受 }).completionHandler(res -> {//注冊完成后通知事件,適用于集群中比較慢的情況下 System.out.println("注冊處理器結果"+res.succeeded()); }); //撤銷處理器 //consumer.unregister(); } }
四 注冊部署Verticcle
vertx.deployVerticle(ConsumerVerticle.class.getName()); TimeUnit.SECONDS.sleep(1); vertx.deployVerticle(ProducerVerticle.class.getName());
五 測試
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Git恢復之前版本的兩種方法reset、revert(圖文詳解)
- Git撤銷&回滾操作(git reset 和 get revert)
- IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab and set serverTimezone prope的問題
- PIL包中Image模塊的convert()函數的具體使用
- Tensorflow 模型轉換 .pb convert to .lite實例
- MySQL數據庫中CAST與CONVERT函數實現類型轉換的講解
- SpringBoot基于HttpMessageConverter實現全局日期格式化
- 使用IDEA和Gradle構建Vertx項目(圖文步驟)
- Vert.x運行環(huán)境搭建流程圖解
相關文章
vue中手機號,郵箱正則驗證以及60s發(fā)送驗證碼的實例
下面小編就為大家分享一篇vue中手機號,郵箱正則驗證以及60s發(fā)送驗證碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03Vue3系列之effect和ReactiveEffect?track?trigger源碼解析
這篇文章主要為大家介紹了Vue3系列之effect和ReactiveEffect?track?trigger源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10vue3+ts數組去重方及reactive/ref響應式顯示流程分析
這篇文章主要介紹了vue3+ts數組去重方法-reactive/ref響應式顯示,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04vue前臺顯示500和405錯誤的解決(springboot為后臺)
這篇文章主要介紹了vue前臺顯示500和405錯誤的解決(springboot為后臺),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07