package org.jgroups.protocols; import org.jgroups.Event; import org.jgroups.annotations.Property; import org.jgroups.annotations.Unsupported; import org.jgroups.stack.Protocol; import org.jgroups.util.Util; /** * Delays incoming/outgoing messages by a random number of milliseconds (range between 0 and n * where n is determined by the user). Incoming messages can be delayed independently from * outgoing messages (or not delayed at all).<p> * This protocol should be inserted directly above the bottommost protocol (e.g. UDP). */ @Unsupported public class DELAY extends Protocol { @Property int in_delay=0; @Property int out_delay=0; public int getInDelay() { return in_delay ; } public void setInDelay(int in_delay) { this.in_delay=in_delay ; } public int getOutDelay() { return out_delay ; } public void setOutDelay(int out_delay) { this.out_delay=out_delay ; } public Object up(Event evt) { int delay=in_delay > 0 ? computeDelay(in_delay) : 0; switch(evt.getType()) { case Event.MSG: // Only delay messages, not other events ! if(log.isTraceEnabled()) log.trace("delaying incoming message for " + delay + " milliseconds"); Util.sleep(delay); break; } return up_prot.up(evt); // Pass up to the layer above us } public Object down(Event evt) { int delay=out_delay > 0 ? computeDelay(out_delay) : 0; switch(evt.getType()) { case Event.MSG: // Only delay messages, not other events ! if(log.isTraceEnabled()) log.trace("delaying outgoing message for " + delay + " milliseconds"); Util.sleep(delay); break; } return down_prot.down(evt); // Pass on to the layer below us } /** * Compute a random number between 0 and n */ static int computeDelay(int n) { return (int)((Math.random() * 1000000) % n); } }