Vertx基于EventBus發(fā)送接受自定義對象
先看官方文檔步驟:

需要一個編解碼器,看源碼:

可見內(nèi)置了需要數(shù)據(jù)類型的實現(xiàn),所以發(fā)送其他消息可以發(fā)送,但是如果發(fā)送自定義對象就需要自己實現(xiàn)編解碼邏輯了
一 自定義編解碼器
/**
* 自定義對象編解碼器,兩個類型可用于消息轉(zhuǎn)換,即發(fā)送對象轉(zhuǎn)換為接受需要的對象
*/
public class CustomizeMessageCodec implements MessageCodec<OrderMessage, OrderMessage> {
/**
* 將消息實體封裝到Buffer用于傳輸
* 實現(xiàn)方式:使用對象流從對象中獲取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中獲取消息對象
@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)換---");//可對接受消息進(jìn)行轉(zhuǎn)換,比如轉(zhuǎn)換成另一個對象等
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ā)送注冊此地址的一個,采用不嚴(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("收到消費者確認(rèn)信息:"+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實例默認(rèn)是單例
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("收到了!"); // 回復(fù)生產(chǎn)者,send才能接受
}).completionHandler(res -> {//注冊完成后通知事件,適用于集群中比較慢的情況下
System.out.println("注冊處理器結(jié)果"+res.succeeded());
});
//撤銷處理器
//consumer.unregister();
}
}
四 注冊部署Verticcle
vertx.deployVerticle(ConsumerVerticle.class.getName());
TimeUnit.SECONDS.sleep(1);
vertx.deployVerticle(ProducerVerticle.class.getName());
五 測試

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Git恢復(fù)之前版本的兩種方法reset、revert(圖文詳解)
- Git撤銷&回滾操作(git reset 和 get revert)
- IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab and set serverTimezone prope的問題
- PIL包中Image模塊的convert()函數(shù)的具體使用
- Tensorflow 模型轉(zhuǎn)換 .pb convert to .lite實例
- MySQL數(shù)據(jù)庫中CAST與CONVERT函數(shù)實現(xiàn)類型轉(zhuǎn)換的講解
- SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化
- 使用IDEA和Gradle構(gòu)建Vertx項目(圖文步驟)
- Vert.x運行環(huán)境搭建流程圖解
相關(guān)文章
vue中手機(jī)號,郵箱正則驗證以及60s發(fā)送驗證碼的實例
下面小編就為大家分享一篇vue中手機(jī)號,郵箱正則驗證以及60s發(fā)送驗證碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue3系列之effect和ReactiveEffect?track?trigger源碼解析
這篇文章主要為大家介紹了Vue3系列之effect和ReactiveEffect?track?trigger源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
vue3+ts數(shù)組去重方及reactive/ref響應(yīng)式顯示流程分析
這篇文章主要介紹了vue3+ts數(shù)組去重方法-reactive/ref響應(yīng)式顯示,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
vue前臺顯示500和405錯誤的解決(springboot為后臺)
這篇文章主要介紹了vue前臺顯示500和405錯誤的解決(springboot為后臺),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

