什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以这个玩意说白了就是让对象转成json,再从json转换回来这么一个东西吧。

直接开始举例子吧,首先涉及到一个JavaBean

package cn.zcrazy.giveupvertx.codec;
public class MyMessage {private String id;private String name;private int age;public MyMessage(String id, String name, int age) {this.id = id;this.name = name;this.age = age;}public String getId() {return id;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "MyMessage{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

然后就是编写这个javaBean的Codec,Codec需要实现5个方法,一个是encode,一个decode,一个transform,一个name,一个systemCodecID,name必须是独一无二的,可以简单的使用类名来代替,systemCodecID是-1.

主要是上面的三种方法,vertx的eventbus可以传输到本地的verticle也可以传输到远程的verticle,传输到本地会用到Codec中的transform,而远程就需要encodeToWire和decodeFromWire了,这里先调用本地的

package cn.zcrazy.giveupvertx.codec;import io.vertx.core.buffer.Buffer;
import io.vertx.core.eventbus.MessageCodec;
import io.vertx.core.json.JsonObject;public class MyMessageCodec implements MessageCodec<MyMessage, MyMessage> {@Overridepublic void encodeToWire(Buffer buffer, MyMessage myMessage) {JsonObject jsonToEncode = new JsonObject();jsonToEncode.put("id", myMessage.getId());jsonToEncode.put("name", myMessage.getName());jsonToEncode.put("age", myMessage.getAge());String jsonToStr = jsonToEncode.encode();int length = jsonToStr.getBytes().length;buffer.appendInt(length);buffer.appendString(jsonToStr);}@Overridepublic MyMessage decodeFromWire(int position, Buffer buffer) {int _pos = position;int length = buffer.getInt(_pos);String jsonStr = buffer.getString(_pos+=4, _pos+=length);JsonObject contentJson = new JsonObject(jsonStr);int age = contentJson.getInteger("age");String name = contentJson.getString("name");String id = contentJson.getString("id");// We can finally create custom message objectreturn new MyMessage(id, name, age);}@Overridepublic MyMessage transform(MyMessage myMessage) {return myMessage;}@Overridepublic String name() {return this.getClass().getSimpleName();}@Overridepublic byte systemCodecID() {return -1;}

然后就是之前章节里面的三个verticle,主Verticle,Sender和Receiver

package cn.zcrazy.giveupvertx.codec;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.EventBus;
public class CodecReceiverVerticle extends AbstractVerticle {@Overridepublic void start(){EventBus eb = vertx.eventBus();eb.consumer("ping-address", message -> {MyMessage myMessage = (MyMessage)message.body();System.out.println("Custom message received: " + myMessage.toString());MyMessage reply = new MyMessage("reply",myMessage.getName(),myMessage.getAge());message.reply(reply);});System.out.println("Receiver ready!");}
}
package cn.zcrazy.giveupvertx.codec;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.EventBus;
public class CodecSenderVerticle extends AbstractVerticle {@Overridepublic void start(){EventBus eb = vertx.eventBus();eb.registerDefaultCodec(MyMessage.class,new MyMessageCodec());MyMessage myMessage = new MyMessage("test","zcrazy",102);vertx.setPeriodic(1000, v -> {eb.request("ping-address", myMessage,reply->{System.out.println("Request message reply: "+reply.result().body());});});}
}
package cn.zcrazy.giveupvertx;import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;public class MainVerticle extends AbstractVerticle {public static void main(String[] args) {Vertx.vertx().deployVerticle("cn.zcrazy.giveupvertx.MainVerticle");}@Overridepublic void start(){vertx.deployVerticle("cn.zcrazy.giveupvertx.codec.CodecReceiverVerticle");vertx.deployVerticle("cn.zcrazy.giveupvertx.codec.CodecSenderVerticle");}
}

启动之后输出如下:从输出可以看出,本地的传输,确实只走了transform。

以上就是今天的内容,有什么不懂的可以留言讨论,本节中的遗留问题会在下一节进行展示。

【java】vertx从入门到放弃——入门(四)Codec相关推荐

  1. Unity3D 从入门到放弃(四)----打飞碟

    Unity3D 从入门到放弃(四) -–打飞碟 填坑计划的万恶之源 写在开头: 本来感觉应该是不会写博客的,而且也不是很擅长写 博客.但在后来,突然醒悟到,博客这个东西,实际上并不是给别人看的(感觉也 ...

  2. GPS从入门到放弃(四) --- GPS信号结构

    GPS从入门到放弃(四) - GPS信号结构 GPS信号结构可以分为三层: 载波 伪码 数据码 载波 载波是三层里的基础,伪码和数据码都是调制在载波上才能发送.GPS有两个载波频率,L1和L2,L1为 ...

  3. flink入门_Flink从入门到放弃-入门篇

    大数据成神之路: 点我去成神之路系列目录^_^ Java高级特性增强-集合 Java高级特性增强-多线程 Java高级特性增强-Synchronized Java高级特性增强-volatile Jav ...

  4. JavaScript从入门到放弃 -(四)E5 新增方法

    目录 5. trim方法 6. 对象方法 6.1 Object.keys() 6.1.1 作用 6.1.2 语法 6.2 Object.defineProperty() 6.2.1 作用 6.2.2 ...

  5. 《java从入门到放弃》_JAVA从入门到放弃(四)

    专栏更新到三月六号,发现实在没动力干下去了,不是没人关注.没人看到不要紧,反正我这人低调,再者我写这些东西的目的就是记录吧,方便以后自己看. 关键是这样做真的好累,每天都有很多课程去学习,虽然说大学相 ...

  6. 百无聊赖之JavaEE从入门到放弃(四)垃圾回收机制(Garbage Collection)

    目录 一.垃圾回收原理和算法 1.内存管理 2.垃圾回收过程 3.垃圾回收相关算法 二.通用的分代垃圾回收机制 1.年轻代 2.年老代 3.永久代 4.三种GC 三. JVM调优和Full GC 四. ...

  7. 数据挖掘从入门到放弃(四):手撕(绘)关联规则挖掘算法

    友情提示:篇幅较长.多图(手绘),请备好流量. 前面我们讨论了线性回归.逻辑回归.决策树和朴素贝叶斯等,今天我们来看什么呢? 关联规则简介 关联规则挖掘可以让我们从数据集中发现项与项之间的关系,它在我 ...

  8. keras从入门到放弃(十四)模型的保存

    今天来探讨模型的保存 Keras使用HDF5文件系统来保存模型.模型保存的方法很容易,只需要使用save()方法即可. 上次训练好了手写数字识别数据集,今天学会如何保存数据集 保存/加载整个模型 Ke ...

  9. Flask入门到放弃(四)—— 数据库

    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10979970.html 数据库操作 ORM ORM 全拼Object-Relation Mappi ...

最新文章

  1. 在 Windows Server 2008 下安装 Community Clips
  2. 特斯拉提升安全监控等级,推出“哨兵模式”
  3. 关于mysql-connector-net在C#中的用法
  4. Makefile 7——自动生成依赖关系 三颗星
  5. linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)
  6. 【Gamma】 Phylab 发布说明
  7. mysql中完成登陆注册_Flask+MySql实现用户登录注册
  8. c语言程序设计教程pdf下载,C语言程序设计教程PDF合集-中国科技大学.pdf
  9. hg255d php,hg255d强刷华硕rt-n13u官方固件果断中继成功
  10. Qt入门教程【高级控件篇】QTreeView树形视图
  11. hcie lab 实验挂了怎么办?
  12. 点云八个方向极值点获取
  13. 自建网站教程!如何用云服务器搭建个人网站?
  14. 计算机输入开机密码无法进入,电脑开机无法输入密码怎么办
  15. MySQL入门学习教程
  16. 用Javascript实现Blogger/Blogspot的传统模板翻页功能
  17. vue 实现上拉加载下拉刷新(思路贼清晰)
  18. 机器学习数据挖掘-软件、网站、课程资源知识点汇总
  19. You have installed a lot of useless repos and Yum is not working properly becaus
  20. woocommerce对接paypal如何进行沙盒测试?

热门文章

  1. 玩转CSS中块元素、内联元素、内联块元素
  2. 计算机组成原理:定点数和浮点数、校验码
  3. 电子商务海外订单日超百万 全球经济回暖初显征兆
  4. uclibc、eglibc、glibc、Musl-libc之间的区别和联系
  5. PDF文件添加水印怎么添加?只需要两步轻松添加水印
  6. SpringMVC3----@Controller注解、RestFul风格的讲解和应用、SpringMVC的接受请求参数、网页跳转方式和数据回显、乱码问题
  7. 中小学科技创新实验室
  8. RSS阅读器BT sync
  9. EXNESS外汇官网:exness-ch com 95%交易者的账户是处于失控状态
  10. Java swing如何做出菜单栏控制工具栏的界面