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中的一些定位属性[图解]
Jul 14 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
Angular中实现树形结构视图实例代码
May 05 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 Javascript
ES6小技巧之代替lodash
Jun 07 Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 28 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的session过期设置
2013/06/29 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
python matlab库简单用法讲解
2020/12/31 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
企业申诉管理制度
2014/01/30 职场文书
美食节策划方案
2014/05/26 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
使用Redis做预定库存缓存功能
2022/04/02 Redis