You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:47:11