if (highPriorityQueue.size() <= 0)
return null;
RMMessageContext msg = null;
int size = highPriorityQueue.size();
synchronized (highPriorityQueue) {
forLoop: //Label
for (int i = 0; i < size; i++) {
RMMessageContext tempMsg = (RMMessageContext) highPriorityQueue.get(i);
if (tempMsg != null) {
switch (tempMsg.getMessageType()) {
//Create seq messages will not be removed.
case Constants.MSG_TYPE_CREATE_SEQUENCE_REQUEST:
long lastSentTime = tempMsg.getLastSentTime();
Date d = new Date();
long currentTime = d.getTime();
if (currentTime >=
lastSentTime + Constants.RETRANSMISSION_INTERVAL) {
String newCreateSeqId = Constants.UUID + uuidGen.nextUUID();
tempMsg.setMessageID(newCreateSeqId);
tempMsg.setLastSentTime(currentTime);
msg = tempMsg;
break forLoop;
}
break;
case Constants.MSG_TYPE_ACKNOWLEDGEMENT:
//acks are send in the folowing manner.
//If a ack the system has asked to send a ack (sequence.sendAck==true)
//then send it immediately.
//Also send a ack when a interval (ACKNOWLEDGEMENT_INTERVAL) has passed
//since last message arrived.
String sequenceId = tempMsg.getSequenceID();
if (sequenceId == null)
continue;
String key = getKeyFromIncomingSequenceId(sequenceId);
IncomingSequence sequence = (IncomingSequence) incomingMap.get(key);
if (sequence == null)
continue;
d = new Date();
currentTime = d.getTime();
if (sequence.isSendAck()) {
tempMsg.setLastSentTime(currentTime);
msg = tempMsg;
sequence.setSendAck(false);
sequence.setFinalAckedTime(currentTime);
break forLoop;
} else {
long ackInterval = PolicyLoader.getInstance()
.getAcknowledgementInterval();
long finalAckedTime = sequence.getFinalAckedTime();
long finalMsgArrivedTime = sequence.getFinalMsgArrivedTime();
if ((finalMsgArrivedTime > finalAckedTime) &&
(currentTime > finalMsgArrivedTime + ackInterval))
sequence.setSendAck(true);
}
break;
default:
highPriorityQueue.remove(i);
queueBin.put(tempMsg.getMessageID(), tempMsg);
msg = tempMsg;
break forLoop;
}
}
}