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版DateAdd和DateDiff函数代码
Mar 01 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
浅析AngularJs HTTP响应拦截器
Dec 28 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
Jan 21 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
微信小程序的日期选择器的实例详解
Sep 29 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
React Native中Mobx的使用方法详解
Dec 04 Javascript
微信小程序webview实现长按点击识别二维码功能示例
Jan 24 Javascript
layui表格 列自动适应大小失效的解决方法
Sep 06 Javascript
jquery传参及获取方式(两种方式)
Feb 13 jQuery
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 程序员应该使用的10个组件
2009/10/31 PHP
PHPMailer 中文使用说明小结
2010/01/22 PHP
php 读取文件乱码问题
2010/02/20 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
NumPy 如何生成多维数组的方法
2018/02/05 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
新郎父亲婚宴答谢词
2014/01/11 职场文书
安踏广告词改编版
2014/03/21 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
Django程序的优化技巧
2021/04/29 Python
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS