@Override public void doSimStep(double time) { finished = false; // I don't think we can restart once the queue has run dry, but just in case. if (lookahead != null && time < lookahead.getMessageArrivalTime()) { return; } if (lookahead != null) { lookahead.processEvent(); lookahead.handleMessage(); lookahead = null; } while (!queue.isEmpty()) { Message m = queue.getNextMessage(); if (m != null && m.getMessageArrivalTime() <= time) { m.processEvent(); m.handleMessage(); } else { lookahead = m; return; } } finished = true; // queue has run dry. }
public void sendMessage(Message m, SimUnit targetUnit, double messageArrivalTime) { m.setSendingUnit(this); m.setReceivingUnit(targetUnit); m.setMessageArrivalTime(messageArrivalTime); scheduler.schedule(m); }
/** * * The comparison is done according to the message arrival Time. If the time * is equal of two messages, then the priority of the messages is compared */ @Override public int compareTo(Message otherMessage) { if (messageArrivalTime > otherMessage.messageArrivalTime) { return 1; } else if (messageArrivalTime < otherMessage.messageArrivalTime) { return -1; } else { // higher priority means for a queue, that it comes first return otherMessage.getPriority() - priority; } }
private void addNetworkChangeEventToMessageQ(NetworkChangeEvent changeEvent) { Message m = new Message() { @Override public void processEvent() { } @Override public void handleMessage() { applyTheChangeEvent(changeEvent); } }; m.setMessageArrivalTime(changeEvent.getStartTime()); this.messageQueue.putMessage(m); }
public void testPutMessage3(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(2); Message m2=new DummyMessage(); m2.setMessageArrivalTime(1); Message m3=new DummyMessage(); m3.setMessageArrivalTime(1); mq.putMessage(m1); mq.putMessage(m2); mq.putMessage(m3); assertEquals(3, mq.getQueueSize()); assertEquals(true, mq.getNextMessage().getMessageArrivalTime()==1); }
public void testMessagePriority(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(1); m1.setPriority(10); Message m2=new DummyMessage(); m2.setMessageArrivalTime(1); m2.setPriority(5); Message m3=new DummyMessage(); m3.setMessageArrivalTime(1); m3.setPriority(20); mq.putMessage(m1); mq.putMessage(m2); mq.putMessage(m3); assertEquals(true, mq.getNextMessage()==m3); assertEquals(true, mq.getNextMessage()==m1); assertEquals(true, mq.getNextMessage()==m2); assertEquals(0, mq.getQueueSize()); assertEquals(true, mq.isEmpty()); }
/** * * Remove the message from the queue and discard it. - queue1.remove(m) does * not function, because it discards all message with the same priority as m * from the queue. - This java api bug is reported at: * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6207984 * * => queue1.removeAll(Collections.singletonList(m)); can be used, but it has * been removed because of just putting a flag to kill a message is more efficient. * * @param m */ public void removeMessage(Message m) { m.killMessage(); queueSize--; }
/** * * get the first message in the queue (with least time stamp) * * @return */ public Message getNextMessage() { Message m = null; if (queue1.peek() != null) { // skip over dead messages while ((m = queue1.poll()) != null && !m.isAlive()) { } // only decrement, if message fetched if (m != null) { queueSize--; } } return m; }
@Inject public JDEQSimulation(final JDEQSimConfigGroup config, final Scenario scenario, final EventsManager events) { Road.setConfig(config); Message.setEventsManager(events); this.config = config; this.scenario = scenario; this.events = events; this.activityDurationInterpretation = this.scenario.getConfig().plans().getActivityDurationInterpretation(); }
@Override public void endActivityAndComputeNextState(double now) { delegate.endActivityAndComputeNextState(now); Message m = new Message() { @Override public void processEvent() { } @Override public void handleMessage() { onTenMinutesAfterDeparting(); } }; m.setMessageArrivalTime(now + 10.0 * 60.0); messageQueue.putMessage(m); }
public void startSimulation() { Message m; while (!queue.isEmpty() && simTime < simulationEndTime) { m = queue.getNextMessage(); if (m != null) { simTime = m.getMessageArrivalTime(); m.processEvent(); m.handleMessage(); } printLog(); } }
public void testPutMessage2(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(2); Message m2=new DummyMessage(); m2.setMessageArrivalTime(1); mq.putMessage(m1); mq.putMessage(m2); assertEquals(2, mq.getQueueSize()); assertEquals(true, mq.getNextMessage()==m2); }
public void testPutMessage1(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(1); Message m2=new DummyMessage(); m2.setMessageArrivalTime(2); mq.putMessage(m1); mq.putMessage(m2); assertEquals(2, mq.getQueueSize()); assertEquals(true, mq.getNextMessage()==m1); }
public void testRemoveMessage1(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(1); Message m2=new DummyMessage(); m2.setMessageArrivalTime(2); mq.putMessage(m1); mq.putMessage(m2); mq.removeMessage(m1); assertEquals(1, mq.getQueueSize()); assertEquals(true, mq.getNextMessage()==m2); assertEquals(0, mq.getQueueSize()); }
public void testRemoveMessage2(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(1); Message m2=new DummyMessage(); m2.setMessageArrivalTime(2); mq.putMessage(m1); mq.putMessage(m2); mq.removeMessage(m2); assertEquals(1, mq.getQueueSize()); assertEquals(true, mq.getNextMessage()==m1); assertEquals(0, mq.getQueueSize()); }
public void testRemoveMessage3(){ MessageQueue mq=new MessageQueue(); Message m1=new DummyMessage(); m1.setMessageArrivalTime(1); Message m2=new DummyMessage(); m2.setMessageArrivalTime(1); mq.putMessage(m1); mq.putMessage(m2); mq.removeMessage(m1); assertEquals(1, mq.getQueueSize()); assertEquals(false, mq.isEmpty()); assertEquals(true, mq.getNextMessage()==m2); assertEquals(0, mq.getQueueSize()); assertEquals(true, mq.isEmpty()); }