@ -16,16 +16,13 @@
package org.thingsboard.server.service.edge ;
import com.fasterxml.jackson.databind.node.ObjectNode ;
import com.google.common.util.concurrent.FutureCallback ;
import com.google.common.util.concurrent.Futures ;
import com.google.common.util.concurrent.ListenableFuture ;
import lombok.extern.slf4j.Slf4j ;
import org.checkerframework.checker.nullness.qual.Nullable ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.context.ApplicationEventPublisher ;
import org.springframework.stereotype.Service ;
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.edge.Edge ;
import org.thingsboard.server.common.data.edge.EdgeEventType ;
@ -59,7 +56,7 @@ import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy ;
import java.util.UUID ;
import java.util.concurrent.ExecutorService ;
import java.util.concurrent.Executors ;
import java.util.concurrent.TimeUnit ;
@Service
@TbCoreComponent
@ -128,17 +125,20 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
@Autowired
protected ApplicationEventPublisher eventPublisher ;
private ExecutorService dbCallBackExecutor ;
@Value ( "${actors.system.edge_dispatcher_pool_size:4}" )
private int edgeDispatcherSize ;
private ExecutorService executor ;
@PostConstruct
public void initExecutor ( ) {
dbCallBackE xecutor = Executors . newSingleThreadExecutor ( ThingsBoardThreadFactory . forName ( "edge-notifications" ) ) ;
e xecutor = ThingsBoard Executors. newWorkStealingPool ( edgeDispatcherSize , "edge-notifications" ) ;
}
@PreDestroy
public void shutdownExecutor ( ) {
if ( dbCallBackE xecutor ! = null ) {
dbCallBackE xecutor. shutdownNow ( ) ;
if ( e xecutor ! = null ) {
e xecutor. shutdownNow ( ) ;
}
}
@ -157,79 +157,78 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService {
public void pushNotificationToEdge ( TransportProtos . EdgeNotificationMsgProto edgeNotificationMsg , TbCallback callback ) {
TenantId tenantId = TenantId . fromUUID ( new UUID ( edgeNotificationMsg . getTenantIdMSB ( ) , edgeNotificationMsg . getTenantIdLSB ( ) ) ) ;
log . debug ( "[{}] Pushing notification to edge {}" , tenantId , edgeNotificationMsg ) ;
final long deadline = System . nanoTime ( ) + TimeUnit . SECONDS . toNanos ( 60 ) ;
try {
EdgeEventType type = EdgeEventType . valueOf ( edgeNotificationMsg . getType ( ) ) ;
ListenableFuture < Void > future ;
switch ( type ) {
case EDGE :
future = edgeProcessor . processEdgeNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ASSET :
future = assetProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DEVICE :
future = deviceProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ENTITY_VIEW :
future = entityViewProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DASHBOARD :
future = dashboardProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case RULE_CHAIN :
future = ruleChainProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case USER :
future = userProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case CUSTOMER :
future = customerProcessor . processCustomerNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DEVICE_PROFILE :
future = deviceProfileProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ASSET_PROFILE :
future = assetProfileProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case OTA_PACKAGE :
future = otaPackageProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case WIDGETS_BUNDLE :
future = widgetBundleProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case WIDGET_TYPE :
future = widgetTypeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case QUEUE :
future = queueProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ALARM :
future = alarmProcessor . processAlarmNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case RELATION :
future = relationProcessor . processRelationNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case TENANT :
future = tenantEdgeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case TENANT_PROFILE :
future = tenantProfileEdgeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
default :
log . warn ( "[{}] Edge event type [{}] is not designed to be pushed to edge" , tenantId , type ) ;
future = Futures . immediateFuture ( null ) ;
}
Futures . addCallback ( future , new FutureCallback < > ( ) {
@Override
public void onSuccess ( @Nullable Void unused ) {
callback . onSuccess ( ) ;
}
@Override
public void onFailure ( Throwable throwable ) {
callBackFailure ( tenantId , edgeNotificationMsg , callback , throwable ) ;
executor . submit ( ( ) - > {
try {
if ( deadline < System . nanoTime ( ) ) {
log . warn ( "[{}] Skipping notification message because deadline reached {}" , tenantId , edgeNotificationMsg ) ;
return ;
}
EdgeEventType type = EdgeEventType . valueOf ( edgeNotificationMsg . getType ( ) ) ;
switch ( type ) {
case EDGE :
edgeProcessor . processEdgeNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ASSET :
assetProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DEVICE :
deviceProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ENTITY_VIEW :
entityViewProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DASHBOARD :
dashboardProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case RULE_CHAIN :
ruleChainProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case USER :
userProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case CUSTOMER :
customerProcessor . processCustomerNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case DEVICE_PROFILE :
deviceProfileProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ASSET_PROFILE :
assetProfileProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case OTA_PACKAGE :
otaPackageProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case WIDGETS_BUNDLE :
widgetBundleProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case WIDGET_TYPE :
widgetTypeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case QUEUE :
queueProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case ALARM :
alarmProcessor . processAlarmNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case RELATION :
relationProcessor . processRelationNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case TENANT :
tenantEdgeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
case TENANT_PROFILE :
tenantProfileEdgeProcessor . processEntityNotification ( tenantId , edgeNotificationMsg ) ;
break ;
default :
log . warn ( "[{}] Edge event type [{}] is not designed to be pushed to edge" , tenantId , type ) ;
}
} catch ( Exception e ) {
callBackFailure ( tenantId , edgeNotificationMsg , callback , e ) ;
}
} , dbCallBackExecutor ) ;
} ) ;
callback . onSuccess ( ) ;
} catch ( Exception e ) {
callBackFailure ( tenantId , edgeNotificationMsg , callback , e ) ;
}