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