Vertx基于EventBus发送接受自定义对象


Posted in Javascript onNovember 16, 2020

先看官方文档步骤:

Vertx基于EventBus发送接受自定义对象

需要一个编解码器,看源码:

Vertx基于EventBus发送接受自定义对象

可见内置了需要数据类型的实现,所以发送其他消息可以发送,但是如果发送自定义对象就需要自己实现编解码逻辑了

一 自定义编解码器

/**
 * 自定义对象编解码器,两个类型可用于消息转换,即发送对象转换为接受需要的对象
 */
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方法是必须的,且发送的时候一定要指明name

二 发送消息编写

public class ProducerVerticle extends AbstractVerticle {
  @Override
  public void start() throws Exception {
    EventBus eventBus = vertx.eventBus();
    //发布消息(群发)
    eventBus.publish("com.hou", "群发祝福!");
    //发送消息(单发),只会发送注册此地址的一个,采用不严格的轮询算法选择
    DeliveryOptions options = new DeliveryOptions();//设置消息头等
    options.addHeader("some-header", "some-value");
    eventBus.send("com.hou", "单发消息",options,ar->{
      if(ar.succeeded()) System.out.println("收到消费者确认信息:"+ar.result().body());
    });
    //发送自定义对象,需要编解码器
    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发送的消息
    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());

五 测试

Vertx基于EventBus发送接受自定义对象

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
Sep 21 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
js中string和number类型互转换技巧(分享)
Nov 28 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
Mar 13 Javascript
AngularJS实现动态添加Option的方法
May 17 Javascript
Vue的轮播图组件实现方法
Mar 03 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
Aug 06 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 #Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
Nov 16 #Javascript
js实现纯前端压缩图片
Nov 16 #Javascript
Vue基于localStorage存储信息代码实例
Nov 16 #Javascript
微信小程序自定义底部弹出框动画
Nov 18 #Javascript
vue 封装面包屑组件教程
Nov 16 #Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
Nov 16 #Javascript
You might like
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
python读取文件名并改名字的实例
2019/01/07 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
生产部统计员岗位职责
2014/01/05 职场文书
班队活动设计方案
2014/01/30 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
竞选演讲稿范文大全
2014/05/12 职场文书
社区服务活动小结
2014/07/08 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫