@ -35,6 +35,7 @@ import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.DashboardInfo ;
import org.thingsboard.server.common.data.DataConstants ;
import org.thingsboard.server.common.data.Device ;
import org.thingsboard.server.common.data.EdgeUtils ;
import org.thingsboard.server.common.data.EntityType ;
import org.thingsboard.server.common.data.EntityView ;
import org.thingsboard.server.common.data.User ;
@ -81,6 +82,7 @@ import org.thingsboard.server.gen.edge.RelationRequestMsg;
import org.thingsboard.server.gen.edge.RuleChainMetadataRequestMsg ;
import org.thingsboard.server.gen.edge.UserCredentialsRequestMsg ;
import org.thingsboard.server.service.executors.DbCallbackExecutorService ;
import org.thingsboard.server.service.queue.TbClusterService ;
import java.io.File ;
import java.nio.charset.StandardCharsets ;
@ -98,6 +100,8 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private static final ObjectMapper mapper = new ObjectMapper ( ) ;
private static final int DEFAULT_LIMIT = 100 ;
@Autowired
private EdgeEventService edgeEventService ;
@ -137,9 +141,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
@Autowired
private DbCallbackExecutorService dbCallbackExecutorService ;
@Autowired
private TbClusterService tbClusterService ;
@Override
public void sync ( Edge edge ) {
log . trace ( "[{}] staring sync process for edge [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
log . trace ( "[{}][{}] Staring edge sync process " , edge . getTenantId ( ) , edge . getId ( ) ) ;
try {
syncWidgetsBundleAndWidgetTypes ( edge ) ;
syncAdminSettings ( edge ) ;
@ -150,21 +157,27 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
syncEntityViews ( edge ) ;
syncDashboards ( edge ) ;
} catch ( Exception e ) {
log . error ( "Exception during sync process" , e ) ;
log . error ( "[{}][{}] Exception during sync process" , edge . getTenantId ( ) , edge . getId ( ) , e ) ;
}
}
private void syncRuleChains ( Edge edge ) {
log . trace ( "[{}] syncRuleChains [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < RuleChain > pageData =
ruleChainService . findRuleChainsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , new TimePageLink ( Integer . MAX_VALUE ) ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] rule chains(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( RuleChain ruleChain : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . RULE_CHAIN , EdgeEventActionType . ADDED , ruleChain . getId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < RuleChain > pageData ;
do {
pageData = ruleChainService . findRuleChainsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , pageLink ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] rule chains(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( RuleChain ruleChain : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . RULE_CHAIN , EdgeEventActionType . ADDED , ruleChain . getId ( ) , null ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
}
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge rule chain(s) on sync!" , e ) ;
}
@ -173,14 +186,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private void syncDevices ( Edge edge ) {
log . trace ( "[{}] syncDevices [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < Device > pageData =
deviceService . findDevicesByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , new TimePageLink ( Integer . MAX_VALUE ) ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] device(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( Device device : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . DEVICE , EdgeEventActionType . ADDED , device . getId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < Device > pageData ;
do {
pageData = deviceService . findDevicesByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , pageLink ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] device(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( Device device : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . DEVICE , EdgeEventActionType . ADDED , device . getId ( ) , null ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
}
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge device(s) on sync!" , e ) ;
}
@ -189,13 +208,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private void syncAssets ( Edge edge ) {
log . trace ( "[{}] syncAssets [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < Asset > pageData = assetService . findAssetsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , new TimePageLink ( Integer . MAX_VALUE ) ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] asset(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( Asset asset : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . ASSET , EdgeEventActionType . ADDED , asset . getId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < Asset > pageData ;
do {
pageData = assetService . findAssetsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , pageLink ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] asset(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( Asset asset : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . ASSET , EdgeEventActionType . ADDED , asset . getId ( ) , null ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
}
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge asset(s) on sync!" , e ) ;
}
@ -204,13 +230,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private void syncEntityViews ( Edge edge ) {
log . trace ( "[{}] syncEntityViews [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < EntityView > pageData = entityViewService . findEntityViewsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , new TimePageLink ( Integer . MAX_VALUE ) ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] entity view(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( EntityView entityView : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . ENTITY_VIEW , EdgeEventActionType . ADDED , entityView . getId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < EntityView > pageData ;
do {
pageData = entityViewService . findEntityViewsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , pageLink ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] entity view(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( EntityView entityView : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . ENTITY_VIEW , EdgeEventActionType . ADDED , entityView . getId ( ) , null ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
}
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge entity view(s) on sync!" , e ) ;
}
@ -219,13 +252,20 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private void syncDashboards ( Edge edge ) {
log . trace ( "[{}] syncDashboards [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < DashboardInfo > pageData = dashboardService . findDashboardsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , new TimePageLink ( Integer . MAX_VALUE ) ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] dashboard(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( DashboardInfo dashboardInfo : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . DASHBOARD , EdgeEventActionType . ADDED , dashboardInfo . getId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < DashboardInfo > pageData ;
do {
pageData = dashboardService . findDashboardsByTenantIdAndEdgeId ( edge . getTenantId ( ) , edge . getId ( ) , pageLink ) ;
if ( pageData ! = null & & pageData . getData ( ) ! = null & & ! pageData . getData ( ) . isEmpty ( ) ) {
log . trace ( "[{}] [{}] dashboard(s) are going to be pushed to edge." , edge . getId ( ) , pageData . getData ( ) . size ( ) ) ;
for ( DashboardInfo dashboardInfo : pageData . getData ( ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . DASHBOARD , EdgeEventActionType . ADDED , dashboardInfo . getId ( ) , null ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
}
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge dashboard(s) on sync!" , e ) ;
}
@ -234,18 +274,36 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
private void syncUsers ( Edge edge ) {
log . trace ( "[{}] syncUsers [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
try {
PageData < User > pageData = userService . findTenantAdmins ( edge . getTenantId ( ) , new PageLink ( Integer . MAX_VALUE ) ) ;
pushUsersToEdge ( pageData , edge ) ;
if ( edge . getCustomerId ( ) ! = null & & ! EntityId . NULL_UUID . equals ( edge . getCustomerId ( ) . getId ( ) ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . CUSTOMER , EdgeEventActionType . ADDED , edge . getCustomerId ( ) , null ) ;
pageData = userService . findCustomerUsers ( edge . getTenantId ( ) , edge . getCustomerId ( ) , new PageLink ( Integer . MAX_VALUE ) ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < User > pageData ;
do {
pageData = userService . findTenantAdmins ( edge . getTenantId ( ) , pageLink ) ;
pushUsersToEdge ( pageData , edge ) ;
}
if ( pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData . hasNext ( ) ) ;
syncCustomerUsers ( edge ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading edge user(s) on sync!" , e ) ;
}
}
private void syncCustomerUsers ( Edge edge ) {
if ( edge . getCustomerId ( ) ! = null & & ! EntityId . NULL_UUID . equals ( edge . getCustomerId ( ) . getId ( ) ) ) {
saveEdgeEvent ( edge . getTenantId ( ) , edge . getId ( ) , EdgeEventType . CUSTOMER , EdgeEventActionType . ADDED , edge . getCustomerId ( ) , null ) ;
TimePageLink pageLink = new TimePageLink ( DEFAULT_LIMIT ) ;
PageData < User > pageData ;
do {
pageData = userService . findCustomerUsers ( edge . getTenantId ( ) , edge . getCustomerId ( ) , pageLink ) ;
pushUsersToEdge ( pageData , edge ) ;
if ( pageData ! = null & & pageData . hasNext ( ) ) {
pageLink = pageLink . nextPageLink ( ) ;
}
} while ( pageData ! = null & & pageData . hasNext ( ) ) ;
}
}
private void syncWidgetsBundleAndWidgetTypes ( Edge edge ) {
log . trace ( "[{}] syncWidgetsBundleAndWidgetTypes [{}]" , edge . getTenantId ( ) , edge . getName ( ) ) ;
List < WidgetsBundle > widgetsBundlesToPush = new ArrayList < > ( ) ;
@ -372,10 +430,11 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
EntityId entityId = EntityIdFactory . getByTypeAndUuid (
EntityType . valueOf ( attributesRequestMsg . getEntityType ( ) ) ,
new UUID ( attributesRequestMsg . getEntityIdMSB ( ) , attributesRequestMsg . getEntityIdLSB ( ) ) ) ;
final EdgeEventType type = getEdgeQueue TypeByEntityType( entityId . getEntityType ( ) ) ;
final EdgeEventType type = EdgeUtils . getEdgeEvent TypeByEntityType( entityId . getEntityType ( ) ) ;
if ( type ! = null ) {
SettableFuture < Void > futureToSet = SettableFuture . create ( ) ;
ListenableFuture < List < AttributeKvEntry > > ssAttrFuture = attributesService . findAll ( edge . getTenantId ( ) , entityId , DataConstants . SERVER_SCOPE ) ;
String scope = attributesRequestMsg . getScope ( ) ;
ListenableFuture < List < AttributeKvEntry > > ssAttrFuture = attributesService . findAll ( edge . getTenantId ( ) , entityId , scope ) ;
Futures . addCallback ( ssAttrFuture , new FutureCallback < List < AttributeKvEntry > > ( ) {
@Override
public void onSuccess ( @Nullable List < AttributeKvEntry > ssAttributes ) {
@ -395,7 +454,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
}
}
entityData . put ( "kv" , attributes ) ;
entityData . put ( "scope" , DataConstants . SERVER_SCOPE ) ;
entityData . put ( "scope" , scope ) ;
JsonNode body = mapper . valueToTree ( entityData ) ;
log . debug ( "Sending attributes data msg, entityId [{}], attributes [{}]" , entityId , body ) ;
saveEdgeEvent ( edge . getTenantId ( ) ,
@ -408,6 +467,11 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
log . error ( "[{}] Failed to send attribute updates to the edge" , edge . getName ( ) , e ) ;
throw new RuntimeException ( "[" + edge . getName ( ) + "] Failed to send attribute updates to the edge" , e ) ;
}
} else {
log . trace ( "[{}][{}] No attributes found for entity {} [{}]" , edge . getTenantId ( ) ,
edge . getName ( ) ,
entityId . getEntityType ( ) ,
entityId . getId ( ) ) ;
}
futureToSet . set ( null ) ;
}
@ -419,27 +483,12 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
}
} , dbCallbackExecutorService ) ;
return futureToSet ;
// TODO: voba - push shared attributes to edge?
// ListenableFuture<List<AttributeKvEntry>> shAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.SHARED_SCOPE);
// ListenableFuture<List<AttributeKvEntry>> clAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.CLIENT_SCOPE);
} else {
log . warn ( "[{}] Type doesn't supported {}" , edge . getTenantId ( ) , entityId . getEntityType ( ) ) ;
return Futures . immediateFuture ( null ) ;
}
}
private EdgeEventType getEdgeQueueTypeByEntityType ( EntityType entityType ) {
switch ( entityType ) {
case DEVICE :
return EdgeEventType . DEVICE ;
case ASSET :
return EdgeEventType . ASSET ;
case ENTITY_VIEW :
return EdgeEventType . ENTITY_VIEW ;
default :
return null ;
}
}
@Override
public ListenableFuture < Void > processRelationRequestMsg ( Edge edge , RelationRequestMsg relationRequestMsg ) {
log . trace ( "[{}] processRelationRequestMsg [{}][{}]" , edge . getTenantId ( ) , edge . getName ( ) , relationRequestMsg ) ;
@ -451,34 +500,47 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
futures . add ( findRelationByQuery ( edge , entityId , EntitySearchDirection . FROM ) ) ;
futures . add ( findRelationByQuery ( edge , entityId , EntitySearchDirection . TO ) ) ;
ListenableFuture < List < List < EntityRelation > > > relationsListFuture = Futures . allAsList ( futures ) ;
return Futures . transform ( relationsListFuture , relationsList - > {
try {
if ( relationsList ! = null & & ! relationsList . isEmpty ( ) ) {
for ( List < EntityRelation > entityRelations : relationsList ) {
log . trace ( "[{}] [{}] [{}] relation(s) are going to be pushed to edge." , edge . getId ( ) , entityId , entityRelations . size ( ) ) ;
for ( EntityRelation relation : entityRelations ) {
try {
if ( ! relation . getFrom ( ) . getEntityType ( ) . equals ( EntityType . EDGE ) & &
! relation . getTo ( ) . getEntityType ( ) . equals ( EntityType . EDGE ) ) {
saveEdgeEvent ( edge . getTenantId ( ) ,
edge . getId ( ) ,
EdgeEventType . RELATION ,
EdgeEventActionType . ADDED ,
null ,
mapper . valueToTree ( relation ) ) ;
SettableFuture < Void > futureToSet = SettableFuture . create ( ) ;
Futures . addCallback ( relationsListFuture , new FutureCallback < List < List < EntityRelation > > > ( ) {
@Override
public void onSuccess ( @Nullable List < List < EntityRelation > > relationsList ) {
try {
if ( relationsList ! = null & & ! relationsList . isEmpty ( ) ) {
for ( List < EntityRelation > entityRelations : relationsList ) {
log . trace ( "[{}] [{}] [{}] relation(s) are going to be pushed to edge." , edge . getId ( ) , entityId , entityRelations . size ( ) ) ;
for ( EntityRelation relation : entityRelations ) {
try {
if ( ! relation . getFrom ( ) . getEntityType ( ) . equals ( EntityType . EDGE ) & &
! relation . getTo ( ) . getEntityType ( ) . equals ( EntityType . EDGE ) ) {
saveEdgeEvent ( edge . getTenantId ( ) ,
edge . getId ( ) ,
EdgeEventType . RELATION ,
EdgeEventActionType . ADDED ,
null ,
mapper . valueToTree ( relation ) ) ;
}
} catch ( Exception e ) {
log . error ( "Exception during loading relation [{}] to edge on sync!" , relation , e ) ;
futureToSet . setException ( e ) ;
return ;
}
}
}
} catch ( Exception e ) {
log . error ( "Exception during loading relation [{}] to edge on sync!" , relation , e ) ;
}
futureToSet . set ( null ) ;
} catch ( Exception e ) {
log . error ( "Exception during loading relation(s) to edge on sync!" , e ) ;
futureToSet . setException ( e ) ;
}
}
}
} catch ( Exception e ) {
log . error ( "Exception during loading relation(s) to edge on sync!" , e ) ;
throw new RuntimeException ( "Exception during loading relation(s) to edge on sync!" , e ) ;
}
return null ;
} , dbCallbackExecutorService ) ;
@Override
public void onFailure ( Throwable t ) {
log . error ( "[{}] Can't find relation by query. Entity id [{}]" , edge . getTenantId ( ) , entityId , t ) ;
futureToSet . setException ( t ) ;
}
} , dbCallbackExecutorService ) ;
return futureToSet ;
}
private ListenableFuture < List < EntityRelation > > findRelationByQuery ( Edge edge , EntityId entityId , EntitySearchDirection direction ) {
@ -534,11 +596,11 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
}
private ListenableFuture < EdgeEvent > saveEdgeEvent ( TenantId tenantId ,
EdgeId edgeId ,
EdgeEventType type ,
EdgeEventActionType action ,
EntityId entityId ,
JsonNode body ) {
EdgeId edgeId ,
EdgeEventType type ,
EdgeEventActionType action ,
EntityId entityId ,
JsonNode body ) {
log . trace ( "Pushing edge event to edge queue. tenantId [{}], edgeId [{}], type [{}], action[{}], entityId [{}], body [{}]" ,
tenantId , edgeId , type , action , entityId , body ) ;
@ -551,6 +613,18 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
edgeEvent . setEntityId ( entityId . getId ( ) ) ;
}
edgeEvent . setBody ( body ) ;
return edgeEventService . saveAsync ( edgeEvent ) ;
ListenableFuture < EdgeEvent > future = edgeEventService . saveAsync ( edgeEvent ) ;
Futures . addCallback ( future , new FutureCallback < EdgeEvent > ( ) {
@Override
public void onSuccess ( @Nullable EdgeEvent result ) {
tbClusterService . onEdgeEventUpdate ( tenantId , edgeId ) ;
}
@Override
public void onFailure ( Throwable t ) {
log . warn ( "[{}] Can't save edge event [{}] for edge [{}]" , tenantId . getId ( ) , edgeEvent , edgeId . getId ( ) , t ) ;
}
} , dbCallbackExecutorService ) ;
return future ;
}
}