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发送接受自定义对象的更多相关文章
- 转-Web Service中三种发送接受协议SOAP、http get、http post
原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...
- 【转载】java实现rabbitmq消息的发送接受
原文地址:http://blog.csdn.net/sdyy321/article/details/9241445 本文不介绍amqp和rabbitmq相关知识,请自行网上查阅 本文是基于spring ...
- NetworkComms V3 之自定义对象
NetworkComms网络通信框架序言 能够发送自定义对象,并且在发送的时候对发送的对象进行加密,压缩是networkComms v3框架的一个重要特性. 具体可以参考源码中 ExampleCons ...
- SpringMvc的自动装箱和GET请求参数可以为自定义对象的思考
在我的概念里边,GET请求需要加上注解@RequestParam,然后它的参数类型只能是 基本数据类型 或者 基本数据类型的包装类,比如:@RequestParam String name(默认是必传 ...
- Java:集合,对列表(List)中的自定义对象按属性(字段)排序(正序、倒序)的方法
1. 要求 对列表(List)中的自定义对象,要求能够按照对象的属性(字段)进行排序(正序.倒序). 如:用户对象(Member)有用户名(username).级别(level).出生日期(birth ...
- jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)
1.表单验证插件——validate 该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({o ...
- 第四章 Spring.Net 如何管理您的类___自定义对象行为
Spring.Net 一直讲求 ” 配置应用程序“,有一种需求在实际开发中不太常用,却非常有用 -> 配置对象的行为,Spring.Net 也能够完美的实现.Spring.Net 通过几个专门的 ...
- JavaScript 自定义对象
在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...
- Sqlite 存储自定义对象
在iOS中如果想保存自定义对象,要让自定义对象实现NSCoding接口并实现方法-(id)initWithCoder:(NSCoder *)coder和-(void)encodeWithCoder:( ...
随机推荐
- asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
前言 我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的.目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结点 ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- 在springboot环境下tk-mybatis的使用记录
1. 新建springboot工程 访问https://start.spring.io/,新建一个springboot工程. 自动生成的工程主要的注意点如下: 1)pom.xml <parent ...
- 跟我一起学QT_QT标准对话框_字体选择框
标准对话框 QT的标准对话框分为以下几种 颜色对话框 文件对话框 字体对话框 输入对话框 消息对话框 进度对话框 错误信息对话框 向导对话框 字体选择框 字体选择框位于 QFontDialog 类中 ...
- Git 连接github
大概如下: 详细如下:如果使用本文命令,请仔细选择,因为添加一些相关命令以供参考. 1 本地仓库 1.1 创建git 仓库 git init # 初始化本地仓库 git --version # 查看G ...
- 「SP25784」BUBBLESORT - Bubble Sort 解题报告
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...
- spark(1.1) mllib 源码分析(三)-决策树
本文主要以mllib 1.1版本为基础,分析决策树的基本原理与源码 一.基本原理 二.源码分析 1.决策树构造 指定决策树训练数据集与策略(Strategy)通过train函数就能得到决策树模型Dec ...
- C# 使用nuget.exe发布类库及更新类库
前景:在开发学习阶段希望一些重复使用代码或者算法代码积累.能够在VS中下载安装方便使用. 准备工作: 1.Nuget登录账号(可 Microsoft 账号).Nuget官网 2.Nuget.exe程序 ...
- 【LC_Lesson7】---将两个有序链表合成新的一个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- C++ 中的 unique 函数
unique 函数是用来去除一个集合中重复元素的函数 若是在数组中,则调用此函数后,返回的除去重复元素的下一个指针的地方 若是在 vector中,则会返回重复元素下一个位置的迭代器,在调用erase函 ...