Notification rule trigger via ClusterService
This commit is contained in:
		
							parent
							
								
									d221cf1354
								
							
						
					
					
						commit
						bbaf2a5054
					
				@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.id.RuleChainId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbActorStopReason;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineComponentLifecycleEventTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineComponentLifecycleEventTrigger;
 | 
			
		||||
 | 
			
		||||
public abstract class RuleEngineComponentActor<T extends EntityId, P extends ComponentMsgProcessor<T>> extends ComponentActor<T, P> {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,7 @@ import org.thingsboard.server.common.msg.queue.TbCallback;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
 | 
			
		||||
import org.thingsboard.server.common.msg.tools.SchedulerUtils;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.ApiUsageLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.ApiUsageLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TenantService;
 | 
			
		||||
import org.thingsboard.server.dao.timeseries.TimeseriesService;
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EdgeId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.AbstractTbEntityService;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@ -40,8 +40,8 @@ import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRequestService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.service.executors.NotificationExecutorService;
 | 
			
		||||
import org.thingsboard.server.service.notification.rule.trigger.NotificationRuleTriggerProcessor;
 | 
			
		||||
import org.thingsboard.server.service.notification.rule.trigger.RuleEngineMsgNotificationRuleTriggerProcessor;
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotifi
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.AlarmAssignmentNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.AlarmAssignmentNotificationRuleTriggerConfig.Action;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotifi
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.AlarmCommentNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,8 +25,8 @@ import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotific
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.AlarmAction;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.AlarmNotificationRuleTriggerConfig.ClearRule;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.AlarmTrigger;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.AlarmTrigger;
 | 
			
		||||
 | 
			
		||||
import static org.apache.commons.collections.CollectionUtils.isEmpty;
 | 
			
		||||
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ import org.thingsboard.server.common.data.notification.info.ApiUsageLimitNotific
 | 
			
		||||
import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.ApiUsageLimitNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.ApiUsageLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.ApiUsageLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TenantService;
 | 
			
		||||
 | 
			
		||||
import static org.apache.commons.collections.CollectionUtils.isEmpty;
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@ import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivi
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.DeviceActivityNotificationRuleTriggerConfig.DeviceEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.service.profile.TbDeviceProfileCache;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ import org.thingsboard.server.common.data.notification.info.EntitiesLimitNotific
 | 
			
		||||
import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.EntitiesLimitNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.EntitiesLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.EntitiesLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TenantService;
 | 
			
		||||
 | 
			
		||||
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotifi
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.EntityActionNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.info.NewPlatformVersionNotificationInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NewPlatformVersionNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.NewPlatformVersionTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NewPlatformVersionTrigger;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.ServiceType;
 | 
			
		||||
import org.thingsboard.server.queue.discovery.PartitionService;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.service.notification.rule.trigger;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.notification.info.RuleOriginatedNotificationInfo;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.notification.rule.trigger.Notification
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.RuleEngineComponentLifecycleEventNotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.ServiceType;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineComponentLifecycleEventTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineComponentLifecycleEventTrigger;
 | 
			
		||||
import org.thingsboard.server.queue.discovery.PartitionService;
 | 
			
		||||
 | 
			
		||||
import java.io.PrintWriter;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.service.notification.rule.trigger;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerConfig;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.RuleEngineMsgTrigger;
 | 
			
		||||
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,7 @@ import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.edge.EdgeEventUpdateMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse;
 | 
			
		||||
import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.ServiceType;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
 | 
			
		||||
@ -531,6 +532,17 @@ public class DefaultTbClusterService implements TbClusterService {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void pushToNotificationRuleProcessingService(NotificationRuleTrigger notificationRuleTrigger) {
 | 
			
		||||
        TransportProtos.NotificationRuleProcessingServiceMsg.Builder msg = TransportProtos.NotificationRuleProcessingServiceMsg.newBuilder()
 | 
			
		||||
                .setTrigger(ByteString.copyFrom(encodingService.encode(notificationRuleTrigger)));
 | 
			
		||||
 | 
			
		||||
        pushMsgToCore(notificationRuleTrigger.getTenantId(), notificationRuleTrigger.getOriginatorEntityId(),
 | 
			
		||||
                ToCoreMsg.newBuilder()
 | 
			
		||||
                        .setNotificationRuleProcessingServiceMsg(msg)
 | 
			
		||||
                        .build(), null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void pushDeviceUpdateMessage(TenantId tenantId, EdgeId edgeId, EntityId entityId, EdgeEventActionType action) {
 | 
			
		||||
        log.trace("{} Going to send edge update notification for device actor, device id {}, edge id {}", tenantId, entityId, edgeId);
 | 
			
		||||
        switch (action) {
 | 
			
		||||
 | 
			
		||||
@ -35,10 +35,12 @@ import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.rpc.RpcError;
 | 
			
		||||
import org.thingsboard.server.common.msg.MsgType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbActorMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.ServiceType;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.TbCallback;
 | 
			
		||||
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
 | 
			
		||||
import org.thingsboard.server.common.stats.StatsFactory;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
 | 
			
		||||
import org.thingsboard.server.gen.transport.TransportProtos;
 | 
			
		||||
import org.thingsboard.server.gen.transport.TransportProtos.DeviceStateServiceMsgProto;
 | 
			
		||||
@ -129,6 +131,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
 | 
			
		||||
    private final OtaPackageStateService firmwareStateService;
 | 
			
		||||
    private final GitVersionControlQueueService vcQueueService;
 | 
			
		||||
    private final NotificationSchedulerService notificationSchedulerService;
 | 
			
		||||
    private final NotificationRuleProcessingService notificationRuleProcessingService;
 | 
			
		||||
    private final TbCoreConsumerStats stats;
 | 
			
		||||
    protected final TbQueueConsumer<TbProtoQueueMsg<ToUsageStatsServiceMsg>> usageStatsConsumer;
 | 
			
		||||
    private final TbQueueConsumer<TbProtoQueueMsg<ToOtaPackageStateServiceMsg>> firmwareStatesConsumer;
 | 
			
		||||
@ -156,7 +159,8 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
 | 
			
		||||
                                        PartitionService partitionService,
 | 
			
		||||
                                        ApplicationEventPublisher eventPublisher,
 | 
			
		||||
                                        Optional<JwtSettingsService> jwtSettingsService,
 | 
			
		||||
                                        NotificationSchedulerService notificationSchedulerService) {
 | 
			
		||||
                                        NotificationSchedulerService notificationSchedulerService,
 | 
			
		||||
                                        NotificationRuleProcessingService notificationRuleProcessingService) {
 | 
			
		||||
        super(actorContext, encodingService, tenantProfileCache, deviceProfileCache, assetProfileCache, apiUsageStateService, partitionService, eventPublisher, tbCoreQueueFactory.createToCoreNotificationsMsgConsumer(), jwtSettingsService);
 | 
			
		||||
        this.mainConsumer = tbCoreQueueFactory.createToCoreMsgConsumer();
 | 
			
		||||
        this.usageStatsConsumer = tbCoreQueueFactory.createToUsageStatsServiceMsgConsumer();
 | 
			
		||||
@ -171,6 +175,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
 | 
			
		||||
        this.firmwareStateService = firmwareStateService;
 | 
			
		||||
        this.vcQueueService = vcQueueService;
 | 
			
		||||
        this.notificationSchedulerService = notificationSchedulerService;
 | 
			
		||||
        this.notificationRuleProcessingService = notificationRuleProcessingService;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostConstruct
 | 
			
		||||
@ -269,6 +274,9 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService<ToCore
 | 
			
		||||
                                    TransportProtos.NotificationSchedulerServiceMsg notificationSchedulerServiceMsg = toCoreMsg.getNotificationSchedulerServiceMsg();
 | 
			
		||||
                                    log.trace("[{}] Forwarding message to notification scheduler service {}", id, toCoreMsg.getNotificationSchedulerServiceMsg());
 | 
			
		||||
                                    forwardToNotificationSchedulerService(notificationSchedulerServiceMsg, callback);
 | 
			
		||||
                                } else if (toCoreMsg.hasNotificationRuleProcessingServiceMsg()) {
 | 
			
		||||
                                    Optional<NotificationRuleTrigger> notificationRuleTrigger = encodingService.decode(toCoreMsg.getNotificationRuleProcessingServiceMsg().getTrigger().toByteArray());
 | 
			
		||||
                                    notificationRuleTrigger.ifPresent(notificationRuleProcessingService::process);
 | 
			
		||||
                                }
 | 
			
		||||
                            } catch (Throwable e) {
 | 
			
		||||
                                log.warn("[{}] Failed to process message: {}", id, msg, e);
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.thingsboard.common.util.JacksonUtil;
 | 
			
		||||
import org.thingsboard.server.common.data.ApiUsageRecordKey;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmComment;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmCommentType;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest;
 | 
			
		||||
@ -45,13 +46,12 @@ import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmDataQuery;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.AlarmTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.TbCallback;
 | 
			
		||||
import org.thingsboard.server.common.stats.TbApiUsageReportClient;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmOperationResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.AlarmTrigger;
 | 
			
		||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
 | 
			
		||||
import org.thingsboard.server.service.entitiy.alarm.TbAlarmCommentService;
 | 
			
		||||
import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.web.client.RestTemplate;
 | 
			
		||||
import org.thingsboard.common.util.ThingsBoardThreadFactory;
 | 
			
		||||
import org.thingsboard.server.common.data.UpdateMessage;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.NewPlatformVersionTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NewPlatformVersionTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,6 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.service.entitiy.alarm;
 | 
			
		||||
 | 
			
		||||
import com.google.common.util.concurrent.Futures;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.junit.runner.RunWith;
 | 
			
		||||
@ -30,8 +29,7 @@ import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmCommentService;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmService;
 | 
			
		||||
import org.thingsboard.server.dao.customer.CustomerService;
 | 
			
		||||
import org.thingsboard.server.dao.edge.EdgeService;
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@ import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse;
 | 
			
		||||
import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
 | 
			
		||||
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
 | 
			
		||||
import org.thingsboard.server.gen.transport.TransportProtos.ToVersionControlServiceMsg;
 | 
			
		||||
@ -95,4 +96,7 @@ public interface TbClusterService extends TbQueueClusterService {
 | 
			
		||||
    void pushEdgeSyncResponseToCore(FromEdgeSyncResponse fromEdgeSyncResponse);
 | 
			
		||||
 | 
			
		||||
    void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action);
 | 
			
		||||
 | 
			
		||||
    void pushToNotificationRuleProcessingService(NotificationRuleTrigger notificationRuleTrigger);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -969,6 +969,7 @@ message ToCoreMsg {
 | 
			
		||||
  EdgeNotificationMsgProto edgeNotificationMsg = 5;
 | 
			
		||||
  DeviceActivityProto deviceActivityMsg = 6;
 | 
			
		||||
  NotificationSchedulerServiceMsg notificationSchedulerServiceMsg = 7;
 | 
			
		||||
  NotificationRuleProcessingServiceMsg notificationRuleProcessingServiceMsg = 8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* High priority messages with low latency are handled by ThingsBoard Core Service separately */
 | 
			
		||||
@ -1054,3 +1055,7 @@ message NotificationSchedulerServiceMsg {
 | 
			
		||||
  int64 requestIdLSB = 4;
 | 
			
		||||
  int64 ts = 5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message NotificationRuleProcessingServiceMsg {
 | 
			
		||||
  bytes trigger = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmAssigneeUpdate;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ package org.thingsboard.server.dao.alarm;
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmQuery;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.dao.notification;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.NotificationRuleTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
 | 
			
		||||
public interface NotificationRuleProcessingService {
 | 
			
		||||
 | 
			
		||||
@ -17,8 +17,10 @@ package org.thingsboard.server.common.data;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
public class ApiUsageRecordState {
 | 
			
		||||
public class ApiUsageRecordState implements Serializable {
 | 
			
		||||
 | 
			
		||||
    private final ApiFeature apiFeature;
 | 
			
		||||
    private final ApiUsageRecordKey key;
 | 
			
		||||
 | 
			
		||||
@ -19,9 +19,11 @@ import io.swagger.annotations.ApiModel;
 | 
			
		||||
import io.swagger.annotations.ApiModelProperty;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
@ApiModel
 | 
			
		||||
@Data
 | 
			
		||||
public class UpdateMessage {
 | 
			
		||||
public class UpdateMessage implements Serializable {
 | 
			
		||||
 | 
			
		||||
    @ApiModelProperty(position = 1, value = "The message about new platform update available.")
 | 
			
		||||
    private final String message;
 | 
			
		||||
 | 
			
		||||
@ -13,20 +13,18 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.alarm;
 | 
			
		||||
package org.thingsboard.server.common.data.alarm;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
public class AlarmApiCallResult {
 | 
			
		||||
public class AlarmApiCallResult implements Serializable {
 | 
			
		||||
 | 
			
		||||
    private final boolean successful;
 | 
			
		||||
    private final boolean created;
 | 
			
		||||
@ -13,14 +13,14 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@Builder
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@ -13,13 +13,15 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.notification.rule.trigger.NotificationRuleTriggerType;
 | 
			
		||||
 | 
			
		||||
public interface NotificationRuleTrigger {
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
public interface NotificationRuleTrigger extends Serializable {
 | 
			
		||||
 | 
			
		||||
    NotificationRuleTriggerType getType();
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@ -13,7 +13,7 @@
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.dao.notification.trigger;
 | 
			
		||||
package org.thingsboard.server.common.msg.notification.trigger;
 | 
			
		||||
 | 
			
		||||
import lombok.Builder;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
@ -192,6 +192,11 @@ public class HashPartitionService implements PartitionService {
 | 
			
		||||
        return resolve(serviceType, null, tenantId, entityId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isMyPartition(ServiceType serviceType, TenantId tenantId, EntityId entityId) {
 | 
			
		||||
        return resolve(serviceType, tenantId, entityId).isMyPartition();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private TopicPartitionInfo resolve(QueueKey queueKey, EntityId entityId) {
 | 
			
		||||
        int hash = hashFunction.newHasher()
 | 
			
		||||
                .putLong(entityId.getId().getMostSignificantBits())
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,8 @@ public interface PartitionService {
 | 
			
		||||
 | 
			
		||||
    TopicPartitionInfo resolve(ServiceType serviceType, TenantId tenantId, EntityId entityId);
 | 
			
		||||
 | 
			
		||||
    boolean isMyPartition(ServiceType serviceType, TenantId tenantId, EntityId entityId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Received from the Discovery service when network topology is changed.
 | 
			
		||||
     * @param currentService - current service information {@link org.thingsboard.server.gen.transport.TransportProtos.ServiceInfo}
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ package org.thingsboard.server.dao.alarm;
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmQuery;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmSeverity;
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.EntityType;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmModificationRequest;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmStatusFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmUpdateRequest;
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmDataQuery;
 | 
			
		||||
import org.thingsboard.server.dao.DaoUtil;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmDao;
 | 
			
		||||
import org.thingsboard.server.dao.model.ModelConstants;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.AlarmEntity;
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ import org.thingsboard.server.common.data.query.EntityTypeFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
 | 
			
		||||
import org.thingsboard.server.dao.entity.EntityService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.NotificationRuleProcessingService;
 | 
			
		||||
import org.thingsboard.server.dao.notification.trigger.EntitiesLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.common.msg.notification.trigger.EntitiesLimitTrigger;
 | 
			
		||||
import org.thingsboard.server.dao.tenant.TbTenantProfileCache;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ import org.thingsboard.server.common.data.query.EntityKeyType;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.EntityRelation;
 | 
			
		||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
 | 
			
		||||
import org.thingsboard.server.common.data.security.Authority;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmService;
 | 
			
		||||
import org.thingsboard.server.dao.asset.AssetService;
 | 
			
		||||
import org.thingsboard.server.dao.customer.CustomerService;
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.id.DeviceId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.dao.AbstractJpaDaoTest;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmDao;
 | 
			
		||||
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.id.UserId;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmData;
 | 
			
		||||
import org.thingsboard.server.common.data.query.AlarmDataQuery;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmOperationResult;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
 | 
			
		||||
@ -17,9 +17,8 @@ package org.thingsboard.rule.engine.action;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
@Data
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ import org.thingsboard.server.common.data.alarm.Alarm;
 | 
			
		||||
import org.thingsboard.server.common.data.id.AlarmId;
 | 
			
		||||
import org.thingsboard.server.common.data.plugin.ComponentType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@RuleNode(
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.alarm.AlarmCreateOrUpdateActiveRequest
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.plugin.ComponentType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@ import org.thingsboard.server.common.data.id.DashboardId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ import org.thingsboard.server.common.data.script.ScriptLanguage;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgDataType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
 | 
			
		||||
import javax.script.ScriptException;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@ import org.thingsboard.server.common.data.query.FilterPredicateValue;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
 | 
			
		||||
import org.thingsboard.server.common.msg.session.SessionMsgType;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.attributes.AttributesService;
 | 
			
		||||
import org.thingsboard.server.dao.device.DeviceService;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -64,7 +64,7 @@ import org.thingsboard.server.common.msg.TbMsg;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgDataType;
 | 
			
		||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
 | 
			
		||||
import org.thingsboard.server.common.msg.session.SessionMsgType;
 | 
			
		||||
import org.thingsboard.server.dao.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
 | 
			
		||||
import org.thingsboard.server.dao.attributes.AttributesService;
 | 
			
		||||
import org.thingsboard.server.dao.device.DeviceService;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.AttributeKvCompositeKey;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user