Edge events are processed in a separate threads to avoid blocking core consumer threads
This commit is contained in:
parent
94e935636e
commit
fb5c593bb5
@ -22,10 +22,11 @@ import com.google.common.util.concurrent.ListenableFuture;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
|
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.edge.Edge;
|
import org.thingsboard.server.common.data.edge.Edge;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
||||||
@ -59,7 +60,7 @@ import javax.annotation.PostConstruct;
|
|||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@ -128,17 +129,20 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
protected ApplicationEventPublisher eventPublisher;
|
protected ApplicationEventPublisher eventPublisher;
|
||||||
|
|
||||||
private ExecutorService dbCallBackExecutor;
|
@Value("${actors.system.edge_dispatcher_pool_size:4}")
|
||||||
|
private int edgeDispatcherSize;
|
||||||
|
|
||||||
|
private ExecutorService executor;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void initExecutor() {
|
public void initExecutor() {
|
||||||
dbCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("edge-notifications"));
|
executor = ThingsBoardExecutors.newWorkStealingPool(edgeDispatcherSize, "edge-notifications");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreDestroy
|
@PreDestroy
|
||||||
public void shutdownExecutor() {
|
public void shutdownExecutor() {
|
||||||
if (dbCallBackExecutor != null) {
|
if (executor != null) {
|
||||||
dbCallBackExecutor.shutdownNow();
|
executor.shutdownNow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +161,13 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
|
|||||||
public void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback) {
|
public void pushNotificationToEdge(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback) {
|
||||||
TenantId tenantId = TenantId.fromUUID(new UUID(edgeNotificationMsg.getTenantIdMSB(), edgeNotificationMsg.getTenantIdLSB()));
|
TenantId tenantId = TenantId.fromUUID(new UUID(edgeNotificationMsg.getTenantIdMSB(), edgeNotificationMsg.getTenantIdLSB()));
|
||||||
log.debug("[{}] Pushing notification to edge {}", tenantId, edgeNotificationMsg);
|
log.debug("[{}] Pushing notification to edge {}", tenantId, edgeNotificationMsg);
|
||||||
|
final long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(10);
|
||||||
|
executor.submit(() -> {
|
||||||
try {
|
try {
|
||||||
|
if (deadline < System.nanoTime()) {
|
||||||
|
log.warn("[{}] Skipping notification message because deadline reached {}", tenantId, edgeNotificationMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
EdgeEventType type = EdgeEventType.valueOf(edgeNotificationMsg.getType());
|
EdgeEventType type = EdgeEventType.valueOf(edgeNotificationMsg.getType());
|
||||||
ListenableFuture<Void> future;
|
ListenableFuture<Void> future;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -229,10 +239,11 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
|
|||||||
public void onFailure(Throwable throwable) {
|
public void onFailure(Throwable throwable) {
|
||||||
callBackFailure(tenantId, edgeNotificationMsg, callback, throwable);
|
callBackFailure(tenantId, edgeNotificationMsg, callback, throwable);
|
||||||
}
|
}
|
||||||
}, dbCallBackExecutor);
|
}, executor);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
callBackFailure(tenantId, edgeNotificationMsg, callback, e);
|
callBackFailure(tenantId, edgeNotificationMsg, callback, e);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void callBackFailure(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback, Throwable throwable) {
|
private void callBackFailure(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg, TbCallback callback, Throwable throwable) {
|
||||||
|
|||||||
@ -364,6 +364,7 @@ actors:
|
|||||||
tenant_dispatcher_pool_size: "${ACTORS_SYSTEM_TENANT_DISPATCHER_POOL_SIZE:2}"
|
tenant_dispatcher_pool_size: "${ACTORS_SYSTEM_TENANT_DISPATCHER_POOL_SIZE:2}"
|
||||||
device_dispatcher_pool_size: "${ACTORS_SYSTEM_DEVICE_DISPATCHER_POOL_SIZE:4}"
|
device_dispatcher_pool_size: "${ACTORS_SYSTEM_DEVICE_DISPATCHER_POOL_SIZE:4}"
|
||||||
rule_dispatcher_pool_size: "${ACTORS_SYSTEM_RULE_DISPATCHER_POOL_SIZE:8}"
|
rule_dispatcher_pool_size: "${ACTORS_SYSTEM_RULE_DISPATCHER_POOL_SIZE:8}"
|
||||||
|
edge_dispatcher_pool_size: "${ACTORS_SYSTEM_EDGE_DISPATCHER_POOL_SIZE:4}"
|
||||||
tenant:
|
tenant:
|
||||||
create_components_on_init: "${ACTORS_TENANT_CREATE_COMPONENTS_ON_INIT:true}"
|
create_components_on_init: "${ACTORS_TENANT_CREATE_COMPONENTS_ON_INIT:true}"
|
||||||
session:
|
session:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user