数据包在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实际上是将ActiveRouterMessageRouter展开,并添加一行,源代码如下:

//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;
}
本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-27 10:30

results matching ""

    No results matching ""