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 相关文章推荐
细说javascript函数从函数的构成开始
Aug 29 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
iview给radio按钮组件加点击事件的实例
Sep 30 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
Dec 13 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
jQuery实现雪花飘落效果
Aug 02 jQuery
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
微信小程序实现购物车小功能
Dec 30 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中mysql_field_type()函数用法
2014/11/24 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
Promise扫盲贴
2019/06/24 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
销售文员岗位职责
2013/11/29 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
个人对照检查材料
2014/02/12 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
大学生求职信范文
2014/05/24 职场文书
品质口号大全
2014/06/17 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
平遥古城导游词
2015/02/03 职场文书
坎儿井导游词
2015/02/09 职场文书
教师培训学习心得体会
2016/01/21 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript