in coap/src/main/java/org/apache/mina/coap/retry/CoapRetryFilter.java [75:114]
public void messageReceived(IoSession session, Object in, ReadFilterChainController controller) {
LOGGER.debug("Processing a MESSAGE_RECEIVED for session {}", session);
CoapMessage coapMsg = (CoapMessage) in;
String transmissionId = CoapTransmission.uniqueId(session, coapMsg);
switch (coapMsg.getType()) {
case NON_CONFIRMABLE:
// non confirmable message, let's move to the next filter
super.messageReceived(session, coapMsg, controller);
break;
case CONFIRMABLE:
// check if this is a duplicate of a message already processed
CoapMessage ack = processed.get(transmissionId);
if (ack != null) {
// stop the filter chain and send again the ack since it was
// probably lost
LOGGER.debug("Duplicated messages detected with ID {} in session {}", coapMsg.requestId(), session);
controller.callWriteMessageForRead(ack);
} else {
super.messageReceived(session, coapMsg, controller);
}
break;
case ACK:
case RESET:
CoapTransmission t = inFlight.get(transmissionId);
if (t != null) {
// cancel the scheduled retransmission
t.getRetryFuture().cancel(false);
inFlight.remove(transmissionId);
}
super.messageReceived(session, coapMsg, controller);
break;
}
}