The One Simulator消息发送前后操作及TTR协议消息删除问题咨询
在The ONE模拟器中实现消息自定义操作与TTR路由协议的消息删除
一、实现消息发送前/后的自定义操作
有两种可靠的实现方式:
- 重写路由器的
update方法:
继承ActiveRouter(或你使用的路由器子类),在update方法里,先检查当前待发送的消息队列,在调用发送逻辑前插入自定义前置操作;发送完成后,再执行后置逻辑。比如可以遍历getMessageCollection()中的消息,判断状态后处理。 - 使用
MessageListener接口:
实现MessageListener接口,重写对应的回调方法:messageStarted(Message m, DTNHost from, DTNHost to):消息开始发送时触发,用于前置操作;messageTransferred(Message m, DTNHost from, DTNHost to, boolean finalTarget):消息完成传输时触发,用于后置操作。
实现后,在节点初始化时将监听器注册到路由器:router.addMessageListener(new CustomMessageListener())。
二、TTR协议中继后删除消息的正确实现
你尝试重写MessageRouter的sendMessage没生效,是因为The ONE中实际负责消息发送的是ActiveRouter(MessageRouter的子类)的sendMessageToNextHop方法,MessageRouter的sendMessage是抽象方法,通常不会直接被调用。
正确的做法是继承ActiveRouter实现自定义TTR路由器,重写sendMessageToNextHop方法:
@Override protected void sendMessageToNextHop(Message m, Connection con) { // 先执行父类的发送逻辑 super.sendMessageToNextHop(m, con); // 消息发送成功后,删除本地缓冲区的副本 if (this.hasMessage(m.getId())) { this.deleteMessage(m.getId(), false); } }
或者,也可以通过MessageListener的messageTransferred方法处理,但要注意判断消息是否是中继(即finalTarget为false),避免删除已到达目的地的消息:
@Override public void messageTransferred(Message m, DTNHost from, DTNHost to, boolean finalTarget) { if (!finalTarget && from == this.host) { from.getRouter().deleteMessage(m.getId(), false); } }
内容的提问来源于stack exchange,提问作者Lirlisa
相关产品推荐
相关产品推荐

