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网页版计算器的简单实现
Jul 02 Javascript
动态改变div的z-index属性的简单实例
Aug 08 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
Nov 09 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
May 26 Javascript
javascript Function函数理解与实战
Dec 01 Javascript
使用angularjs.foreach时return的问题解决
Sep 30 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
在JavaScript中实现链式调用的实现
Dec 24 Javascript
JS对象属性的检测与获取操作实例分析
Mar 17 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
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
js 小数取整的函数
2010/05/10 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
javascript定时器完整实例
2015/02/10 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
2017/07/04 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
python多线程和多进程关系详解
2020/12/14 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
小学生新学期寄语
2014/01/19 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
医院党员公开承诺书
2014/08/30 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
cypress测试本地web应用
2022/06/01 Javascript