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自动打开页面上链接的实现代码
Sep 25 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
JavaScript高阶函数_动力节点Java学院整理
Jun 28 Javascript
JavaScript简单实现合并两个Json对象的方法示例
Oct 16 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
Feb 22 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
如何在微信小程序中实现Mixins方案
Jun 20 Javascript
JavaScript展开操作符(Spread operator)详解
Jul 20 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安装threads多线程扩展基础教程
2015/11/17 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
html读出文本文件内容
2007/01/22 Javascript
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
使用jQuery实现input数值增量和减量的方法
2015/01/24 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python理解递归的方法总结
2019/01/28 Python
python实现多进程通信实例分析
2019/09/01 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
如何通过python检查文件是否被占用
2020/12/18 Python
高中班主任评语
2014/12/30 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Java异常处理try catch的基本用法
2021/12/06 Java/Android