本文介绍一个自已创建的消息产生器EachToOneMessageGenerator
,即每隔interval
,hosts
每个节点都创建一个消息,不同于MessageEventGenerator
(每隔interval
,整个网络只产生一个消息)。
1. 消息事件产生器
The ONE源码包提供了4种消息事件产生方式,分别是:
MessageEventGenerator
每隔interval
,整个网络只产生一个消息OneToEachMessageGenerator
整个仿真期间最多产生tohosts
个消息OneFromEachMessageGenerator
整个仿真期间最多产生hosts
个消息MessageBurstGenerator
每隔interval
,每个源节点hosts
为每个目的节点tohosts
产生一个新消息
相关博文如下:
- The ONE使用笔记:消息事件产生器MessageEventGenerator
- The ONE使用笔记: 消息创建报告CreatedMessagesReport
- The ONE使用笔记:深入源码理解消息创建过程
本文旨在创建一个消息事件产生器EachToOneMessageGenerator
,即每隔interval
,hosts
每个节点都创建一个消息。
2. EachToOneMessageGenerator
2.1 仿真结果
先看下由EachToOneMessageGenerator
产生的消息创建报告CreatedMessagesReport,相关的设置文件如下:
Events1.class = EachToOneMessageGenerator Events1.hosts = 10,20 Events1.tohosts = 30,40 Events1.interval = 25,35 Report.report2 = CreatedMessagesReport
产生的消息创建报告CreatedMessagesReport,取部分如下(重点看下fromHost
和toHost
列):
# time ID size fromHost toHost TTL isResponse 32.0000 M1 984638 p10 p34 300 N 32.0000 M2 800811 p11 p34 300 N 32.0000 M3 922110 p12 p31 300 N 32.0000 M4 829931 p13 p33 300 N 32.0000 M5 945131 p14 p33 300 N 32.0000 M6 575923 p15 p32 300 N 32.0000 M7 795971 p16 p39 300 N 32.0000 M8 902337 p17 p37 300 N 32.0000 M9 771601 p18 p34 300 N 32.0000 M10 506241 p19 p31 300 N
2.2 源代码
其实代码还是比较简单,继承MessageEventGenerator
,重写nextEvent()
方法。源代码如下:
public class EachToOneMessageGenerator extends MessageEventGenerator { private int nextFromOffset; //next index to use from the "from" range ... @Override public ExternalEvent nextEvent() { int responseSize = 0; /* no responses requested */ int msgSize; int interval; int from; int to; from = this.hostRange[0] + nextFromOffset; to = drawToAddress(hostRange, from); msgSize = drawMessageSize(); MessageCreateEvent mce = new MessageCreateEvent(from, to, getID(), msgSize, responseSize, this.nextEventsTime); if ((this.hostRange[0] + nextFromOffset) == (this.hostRange[1]-1)) { /*** move to next interval ***/ interval = drawNextEventTimeDiff(); this.nextEventsTime += interval; this.nextFromOffset = 0; } else { this.nextFromOffset++; } if (this.msgTime != null && this.nextEventsTime > this.msgTime[1]) { this.nextEventsTime = Double.MAX_VALUE; //next event would be later than the end time } return mce; } }
3. 讨论
细心的你,会发现,上述代码产生的消息都是在同一个时间产生的,更加合理的做法是每个host
都是独立的,即每个host
都是每隔interval
(如从[25, 35]
随机选取)产生一个消息。如果您有思路,期待与我分享。
事实上,消息事件产生器对应于网络的data traffic models,最近在想,什么样的data traffic models才是更合理的,这多半取决于应用,那么应用与data traffic models是怎么对应的,在找这方面的资料,但没什么收获,求分享。
赞赏微信赞赏
支付宝赞赏
Pingback: The ONE使用笔记:目录Spark & Shine | Spark & Shine