diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java index e633025883..ed497b0931 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/impl/CaliforniumLwM2mRequestSender.java @@ -21,6 +21,7 @@ import java.util.SortedMap; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.atomic.AtomicLong; import org.eclipse.californium.core.coap.MessageObserver; import org.eclipse.californium.core.coap.MessageObserverAdapter; @@ -77,8 +78,8 @@ public T send(final Registration destination, final Do final LwM2mModel model = modelProvider.getObjectModel(destination); // Create the CoAP request from LwM2m request - CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder(destination.getIdentity(), destination.getRootPath(), - destination.getId(), destination.getEndpoint(), model, encoder); + CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder(destination.getIdentity(), + destination.getRootPath(), destination.getId(), destination.getEndpoint(), model, encoder); request.accept(coapRequestBuilder); final Request coapRequest = coapRequestBuilder.getRequest(); @@ -113,9 +114,8 @@ public void send(final Registration destination, final final LwM2mModel model = modelProvider.getObjectModel(destination); // Create the CoAP request from LwM2m request - CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder( - destination.getIdentity(), destination.getRootPath(), - destination.getId(), destination.getEndpoint(), model, encoder); + CoapRequestBuilder coapRequestBuilder = new CoapRequestBuilder(destination.getIdentity(), + destination.getRootPath(), destination.getId(), destination.getEndpoint(), model, encoder); request.accept(coapRequestBuilder); final Request coapRequest = coapRequestBuilder.getRequest(); @@ -152,25 +152,27 @@ public void cancelPendingRequests(Registration registration) { requests.clear(); } - private String getFloorKey(String registrationId) { - // The key format is regid#int, So we need a key which is always before this pattern (in natural order). + private static String getFloorKey(String registrationId) { + // The key format is regid#long, So we need a key which is always before this pattern (in natural order). return registrationId + '#'; } - private String getCeilingKey(String registrationId) { - // The key format is regid#int, So we need a key which is always after this pattern (in natural order). + private static String getCeilingKey(String registrationId) { + // The key format is regid#long, So we need a key which is always after this pattern (in natural order). return registrationId + "#A"; } - private String getKey(String registrationId, int requestId) { + private static String getKey(String registrationId, long requestId) { return registrationId + '#' + requestId; } private void addPendingRequest(String registrationId, Request coapRequest) { Validate.notNull(registrationId); - CleanerMessageObserver observer = new CleanerMessageObserver(registrationId, coapRequest); - coapRequest.addMessageObserver(observer); - pendingRequests.put(observer.getRequestKey(), coapRequest); + if (coapRequest.isConfirmable()) { + CleanerMessageObserver observer = new CleanerMessageObserver(registrationId, coapRequest); + coapRequest.addMessageObserver(observer); + pendingRequests.put(observer.getRequestKey(), coapRequest); + } } private void removePendingRequest(String key, Request coapRequest) { @@ -178,6 +180,8 @@ private void removePendingRequest(String key, Request coapRequest) { pendingRequests.remove(key, coapRequest); } + private AtomicLong idGenerator = new AtomicLong(0l); + private class CleanerMessageObserver extends MessageObserverAdapter { private final String requestKey; @@ -185,7 +189,7 @@ private class CleanerMessageObserver extends MessageObserverAdapter { public CleanerMessageObserver(String registrationId, Request coapRequest) { super(); - requestKey = getKey(registrationId, hashCode()); + requestKey = getKey(registrationId, idGenerator.incrementAndGet()); this.coapRequest = coapRequest; }