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 相关文章推荐
完美解决JS中汉字显示乱码问题(已解决)
Dec 27 Javascript
js中的escape及unescape函数的php实现代码
Sep 04 Javascript
jQuery Tools tab(幻灯片)
Jul 14 Javascript
javascript中日期转换成时间戳的小例子
Mar 21 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
Sep 25 Javascript
javascript等号运算符使用详解
Apr 16 Javascript
vue.js指令v-model使用方法
Mar 20 Javascript
vue-router实现webApp切换页面动画效果代码
May 25 Javascript
详解a++和++a的区别
Aug 30 Javascript
js 提取某()特殊字符串长度的实例
Dec 06 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 Javascript
js实现点赞效果
Mar 16 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单态设计模式(单例模式)实例
2014/11/18 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
JavaScript运算符小结
2015/06/03 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
实例详解Node.js 函数
2018/06/10 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
进一步了解Python中的XML 工具
2015/04/13 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
Pygame的程序开始示例代码
2020/05/07 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
忠诚教育心得体会
2014/09/03 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
劳模先进事迹材料
2014/12/24 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技