如何将 queueinglib 与 cPacket 而不是 cMessage 一起使用?

How can use queueinglib with cPacket instead of cMessage?

我使用的是一个非常古老的 queueinglib(可能是十年前的)。其中Job继承自cPacket,而非cMessage。 现在我将 IDE 版本从 5 更改为 6,并且必须更新 queueinglib。当我这样做时,我很惊讶地看到 Job 现在是从 cMessage 继承的。
在我的模型中,我有内部和外部消息(通过数据速率通道)。对于内部消息,使用 cMessage 是可以的,但我需要使用 cPacket 来接收外部消息。这就是为什么我自己的消息类型是从 cPacket 派生的。
现在我有从 cPacket 派生的消息,但 queueinglib 块无法将它们转换为 Job。我怎么解决这个问题?以下是我能想到的一些想法:
-我可以完全更改 queueinglib,但我不想对外部库执行此操作。我相信它使用 cMessage 而不是 cPacket 是有原因的。
-多重继承。我可以从 cMessage 和 cPacket 派生我的消息类型,但我在手册中看到这是不可能的。
-我可以在我的一个块和queueinglib之间传输时创建一条新消息。但是消息 ID 将毫无用处。我会不断地构建和销毁消息..
那么有更好的推荐方法吗?

之所以 Jobsqueueinglib 示例中的消息,是因为这些包从不沿着数据速率通道链接传输,因此它们不需要是数据包,并且该示例有意保持简单尽可能。

但是:这是一个例子。它从来就不是要成为供其他项目使用的外部库,因此它的设计目的不是可扩展的。您可以安全地复制和修改它(我建议 mark/document 您的更改,以防您将来想要 upgrade/compare 库)。

最简单的方法:修改Job.msg,将message Job改为packet Job,就大功告成了。并使用 Job 作为消息的基础。由于 Job 扩展了 Message,整个队列库将正常工作。

不修改 queinglib 源代码:cMessage 中有多个字段可以(误)用于携带指针。例如,您可以使用 setContextPointer()setContolInfo() 来设置数据包的指针(在一些转换之后),只要它进入您使用 queuinglib 的部分,并在离开时删除 prointer。这需要更多的工作(但仅在您的代码中),并且网络数据包不包含来自 queuinlib 字段的任何内容(这是一个正确的设计)的优点是与排队组件相关的数据并不意味着在网络节点之间传输(例如优先级或世代)。

同时使用适当的外部队列库(如 inet 的 src/inet/queueing 文件夹中的库)将是最好的解决方案,但我相信那艘船早就航行了。

简而言之,选择第一个建议。