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 基础篇3 类,回调函数,内置对象,事件处理
Mar 14 Javascript
jQuery实现倒计时按钮功能代码分享
Sep 03 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
基于JS实现省市联动效果代码分享
Jun 06 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
html+js+highcharts绘制圆饼图表的简单实例
Aug 04 Javascript
微信小程序 获取微信OpenId详解及实例代码
Oct 31 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
Vue从TodoList中学父子组件通信
Feb 05 Javascript
深入理解JS异步编程-Promise
Jun 03 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取得一个类的属性和方法的实现代码
2011/05/22 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
Vue性能优化的方法
2020/07/30 Javascript
python判断完全平方数的方法
2018/11/13 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
仓管员岗位职责范文
2013/11/08 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
药店采购员岗位职责
2014/09/30 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB