destroyKafkaSessionIfDisconnectedAndConsumerActive runs for all sessions - edge can be connected to different node and scheduled will not be invoked
This commit is contained in:
parent
32e9efec83
commit
9fa71bff54
@ -69,7 +69,9 @@ import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -193,6 +195,7 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
|
|||||||
this.edgeEventProcessingExecutorService = ThingsBoardExecutors.newScheduledThreadPool(schedulerPoolSize, "edge-event-check-scheduler");
|
this.edgeEventProcessingExecutorService = ThingsBoardExecutors.newScheduledThreadPool(schedulerPoolSize, "edge-event-check-scheduler");
|
||||||
this.sendDownlinkExecutorService = ThingsBoardExecutors.newScheduledThreadPool(sendSchedulerPoolSize, "edge-send-scheduler");
|
this.sendDownlinkExecutorService = ThingsBoardExecutors.newScheduledThreadPool(sendSchedulerPoolSize, "edge-send-scheduler");
|
||||||
this.executorService = ThingsBoardExecutors.newSingleThreadScheduledExecutor("edge-service");
|
this.executorService = ThingsBoardExecutors.newSingleThreadScheduledExecutor("edge-service");
|
||||||
|
this.executorService.scheduleAtFixedRate(this::destroyKafkaSessionIfDisconnectedAndConsumerActive, 60, 60, TimeUnit.SECONDS);
|
||||||
log.info("Edge RPC service initialized!");
|
log.info("Edge RPC service initialized!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,8 +408,6 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
|
|||||||
EdgeId edgeId = session.getEdge().getId();
|
EdgeId edgeId = session.getEdge().getId();
|
||||||
TenantId tenantId = session.getEdge().getTenantId();
|
TenantId tenantId = session.getEdge().getTenantId();
|
||||||
|
|
||||||
destroyKafkaSessionIfDisconnectedAndConsumerActive(tenantId, edgeId, session);
|
|
||||||
|
|
||||||
cancelScheduleEdgeEventsCheck(edgeId);
|
cancelScheduleEdgeEventsCheck(edgeId);
|
||||||
|
|
||||||
if (sessions.containsKey(edgeId)) {
|
if (sessions.containsKey(edgeId)) {
|
||||||
@ -474,22 +475,6 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void destroyKafkaSessionIfDisconnectedAndConsumerActive(TenantId tenantId, EdgeId edgeId, EdgeGrpcSession session) {
|
|
||||||
try {
|
|
||||||
if (session instanceof KafkaEdgeGrpcSession kafkaSession) {
|
|
||||||
if (!kafkaSession.isConnected()
|
|
||||||
&& kafkaSession.getConsumer() != null
|
|
||||||
&& kafkaSession.getConsumer().getConsumer() != null
|
|
||||||
&& !kafkaSession.getConsumer().getConsumer().isStopped()) {
|
|
||||||
sessions.remove(edgeId);
|
|
||||||
kafkaSession.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.warn("[{}] Failed to destroy kafka session for edge [{}]", tenantId, edgeId, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cancelScheduleEdgeEventsCheck(EdgeId edgeId) {
|
private void cancelScheduleEdgeEventsCheck(EdgeId edgeId) {
|
||||||
log.trace("[{}] cancelling edge event check for edge", edgeId);
|
log.trace("[{}] cancelling edge event check for edge", edgeId);
|
||||||
if (sessionEdgeEventChecks.containsKey(edgeId)) {
|
if (sessionEdgeEventChecks.containsKey(edgeId)) {
|
||||||
@ -631,4 +616,27 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void destroyKafkaSessionIfDisconnectedAndConsumerActive() {
|
||||||
|
try {
|
||||||
|
List<EdgeId> toRemove = new ArrayList<>();
|
||||||
|
for (EdgeGrpcSession session : sessions.values()) {
|
||||||
|
if (session instanceof KafkaEdgeGrpcSession kafkaSession &&
|
||||||
|
!kafkaSession.isConnected() &&
|
||||||
|
kafkaSession.getConsumer() != null &&
|
||||||
|
kafkaSession.getConsumer().getConsumer() != null &&
|
||||||
|
!kafkaSession.getConsumer().getConsumer().isStopped()) {
|
||||||
|
toRemove.add(kafkaSession.getEdge().getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (EdgeId edgeId : toRemove) {
|
||||||
|
log.info("[{}] Destroying session for edge because edge is not connected", edgeId);
|
||||||
|
EdgeGrpcSession removed = sessions.remove(edgeId);
|
||||||
|
if (removed instanceof KafkaEdgeGrpcSession kafkaSession) {
|
||||||
|
kafkaSession.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("Failed to cleanup kafka sessions", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user