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 ajax方式直接提交整个表单核心代码
Aug 15 Javascript
Node.js模拟浏览器文件上传示例
Mar 26 Javascript
jQuery如何取id有.的值一般的方法是取不到的
Apr 18 Javascript
JavaScript中判断整数的多种方法总结
Nov 08 Javascript
让angularjs支持浏览器自动填表
Nov 10 Javascript
javascript中cookie对象用法实例分析
Jan 30 Javascript
JavaScript简单实现弹出拖拽窗口(二)
Jun 17 Javascript
总结JavaScript的正则与其他语言的不同之处
Aug 25 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
基于vuex实现购物车功能
Jan 10 Vue.js
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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
python中time.ctime()实例用法
2021/02/03 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
主管会计岗位责任制
2014/02/10 职场文书
节约用水倡议书
2014/04/16 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
教师暑期培训感言
2014/08/15 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
css3 选择器
2022/05/11 HTML / CSS
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android