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:( ...
随机推荐
- java连接elasticsearch:查询、添加数据
导入jar包 <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport --> <depe ...
- 20191031-6beta week 1/2 Scrum立会报告+燃尽图 04
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9914 git地址:https://e.coding.net/Eustia/ ...
- FPGA之IO信号类型深入理解
在FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout). 对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用V ...
- $ [Contest \#4]$求和 思博题
正解: 解题报告: 传送门$QwQ$ 一道看起来是数位$dp$其实并不是的题$QwQ$ 首先求$\sum_{l}^r$就变成$\sum_1^r-\sum_1^{l-1}$不说$QwQ$.现在就只要求$ ...
- <算法><go实现>左括号补全-双栈法
输入:1+2)*33-44)*555-666))) 输出:((1+2)*((33-44)*(555-666))) 代码实现及注释: package main import "fmt" ...
- JVM之GC回收信息详解
一.-XX:+PrintGCDetails 打印GC日志 参数配置:-Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+Pr ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- iscsi,nfs
存储概述 存储的目标 存储是根据不同的应用环境通过采取合理.安全.有效的方式将数据保存到某些介质上并能保证有效的访问. 一方面它是数据临时或长期驻留的物理媒介. 另一方面,它是保证数据完整安全存放的方 ...
- POJ 3304 Segments(判断直线与线段是否相交)
题目传送门:POJ 3304 Segments Description Given n segments in the two dimensional space, write a program, ...
- 论Java中的抽象类与接口
目录 抽象类和抽象方法 定义 与普通类的区别以及注意点: 抽象类的作用 接口 定义 示例 注意 作用 最后:接口与抽象类的异同 使用场景 借鉴 抽象类和抽象方法 定义 抽象方法和抽象类都必须被abst ...