数据包在The ONE叫消息Message,本文介绍如何为消息添加新字段。我之前的做法是直接在Message类上修改,读了SprayAndWaitRouter
源码之后,才知道可以利用The ONE消息属性进行添加,这方法更加直观可控。
1. 概述
为消息添加新字段,涉及到的操作如下:
public static final String MSG_MY_PROPERTY = ; //定义字段名称,假设为MSG_MY_PROPERTY
msg.addProperty(MSG_MY_PROPERTY, new Integer(initialValvue)); //添加字段,重写createNewMessage(Message msg)
Integer nrofCopies = (Integer)m.getProperty(MSG_MY_PROPERTY); //读取
msg.updateProperty(MSG_MY_PROPERTY, value); //更新
2. 实例
为消息创建一个新的属性,重写createNewMessage
,初始化该字段,相关源代码如下:
//MyRouter.java
public static final String EPIDEMICXOR_NS = "EpidemicXorRouter";
public static final String MSG_XOR_PROPERTY = EPIDEMICXOR_NS + "." + "isXor";
@Override
public boolean createNewMessage(Message msg) {
makeRoomForNewMessage(msg.getSize());
msg.setTtl(this.msgTtl);
msg.addProperty(MSG_XOR_PROPERTY, false); //就添加这一行
addToMessages(msg, true);
return true;
}
上述的createNewMessage
实际上是将ActiveRouter
和MessageRouter
展开,并添加一行,源代码如下:
//ActiveRouter.java
@Override
public boolean createNewMessage(Message m) {
makeRoomForNewMessage(m.getSize());
return super.createNewMessage(m);
}
//MessageRouter.java
public boolean createNewMessage(Message m) {
m.setTtl(this.msgTtl);
addToMessages(m, true);
return true;
}