Commit 5c70739e053fa6b04c21e660cdd76306f987e5bb
Committed by
GitHub
Merge pull request #1724 from elbstack/1686-No-response-to-client-side-RPC-via-CoAP
1686 no response to client side rpc via co ap
Showing
3 changed files
with
29 additions
and
3 deletions
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java
... | ... | @@ -192,6 +192,7 @@ public class CoapTransportResource extends CoapResource { |
192 | 192 | new CoapOkCallback(exchange)); |
193 | 193 | break; |
194 | 194 | case TO_SERVER_RPC_REQUEST: |
195 | + transportService.registerSyncSession(sessionInfo, new CoapSessionListener(sessionId, exchange), transportContext.getTimeout()); | |
195 | 196 | transportService.process(sessionInfo, |
196 | 197 | transportContext.getAdaptor().convertToServerRpcRequest(sessionId, request), |
197 | 198 | new CoapNoOpCallback(exchange)); | ... | ... |
... | ... | @@ -178,15 +178,24 @@ public abstract class AbstractTransportService implements TransportService { |
178 | 178 | |
179 | 179 | @Override |
180 | 180 | public void registerSyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener, long timeout) { |
181 | - sessions.putIfAbsent(toId(sessionInfo), new SessionMetaData(sessionInfo, TransportProtos.SessionType.SYNC, listener)); | |
182 | - schedulerExecutor.schedule(() -> { | |
181 | + SessionMetaData currentSession = new SessionMetaData(sessionInfo, TransportProtos.SessionType.SYNC, listener); | |
182 | + sessions.putIfAbsent(toId(sessionInfo), currentSession); | |
183 | + | |
184 | + ScheduledFuture executorFuture = schedulerExecutor.schedule(() -> { | |
183 | 185 | listener.onRemoteSessionCloseCommand(TransportProtos.SessionCloseNotificationProto.getDefaultInstance()); |
184 | 186 | deregisterSession(sessionInfo); |
185 | 187 | }, timeout, TimeUnit.MILLISECONDS); |
188 | + | |
189 | + currentSession.setScheduledFuture(executorFuture); | |
186 | 190 | } |
187 | 191 | |
188 | 192 | @Override |
189 | 193 | public void deregisterSession(TransportProtos.SessionInfoProto sessionInfo) { |
194 | + SessionMetaData currentSession = sessions.get(toId(sessionInfo)); | |
195 | + if (currentSession.hasScheduledFuture()) { | |
196 | + log.debug("Stopping scheduler to avoid resending response if request has been ack."); | |
197 | + currentSession.getScheduledFuture().cancel(false); | |
198 | + } | |
190 | 199 | sessions.remove(toId(sessionInfo)); |
191 | 200 | } |
192 | 201 | ... | ... |
... | ... | @@ -19,6 +19,8 @@ import lombok.Data; |
19 | 19 | import org.thingsboard.server.common.transport.SessionMsgListener; |
20 | 20 | import org.thingsboard.server.gen.transport.TransportProtos; |
21 | 21 | |
22 | +import java.util.concurrent.ScheduledFuture; | |
23 | + | |
22 | 24 | /** |
23 | 25 | * Created by ashvayka on 15.10.18. |
24 | 26 | */ |
... | ... | @@ -29,19 +31,33 @@ class SessionMetaData { |
29 | 31 | private final TransportProtos.SessionType sessionType; |
30 | 32 | private final SessionMsgListener listener; |
31 | 33 | |
34 | + private ScheduledFuture scheduledFuture; | |
35 | + | |
32 | 36 | private volatile long lastActivityTime; |
33 | 37 | private volatile boolean subscribedToAttributes; |
34 | 38 | private volatile boolean subscribedToRPC; |
35 | 39 | |
36 | - SessionMetaData(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.SessionType sessionType, SessionMsgListener listener) { | |
40 | + SessionMetaData( | |
41 | + TransportProtos.SessionInfoProto sessionInfo, | |
42 | + TransportProtos.SessionType sessionType, | |
43 | + SessionMsgListener listener | |
44 | + ) { | |
37 | 45 | this.sessionInfo = sessionInfo; |
38 | 46 | this.sessionType = sessionType; |
39 | 47 | this.listener = listener; |
40 | 48 | this.lastActivityTime = System.currentTimeMillis(); |
49 | + this.scheduledFuture = null; | |
41 | 50 | } |
42 | 51 | |
43 | 52 | void updateLastActivityTime() { |
44 | 53 | this.lastActivityTime = System.currentTimeMillis(); |
45 | 54 | } |
46 | 55 | |
56 | + void setScheduledFuture(ScheduledFuture scheduledFuture) { this.scheduledFuture = scheduledFuture; } | |
57 | + | |
58 | + public ScheduledFuture getScheduledFuture() { | |
59 | + return scheduledFuture; | |
60 | + } | |
61 | + | |
62 | + public boolean hasScheduledFuture() { return null != this.scheduledFuture; } | |
47 | 63 | } | ... | ... |