Commit 22ada62f3bc426faf0158e9c43866f3b457e6c90

Authored by Viacheslav Klimov
Committed by Andrew Shvayka
1 parent 43578c7e

Fix outdated data in alarm clear event

... ... @@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture;
22 22 import lombok.extern.slf4j.Slf4j;
23 23 import org.checkerframework.checker.nullness.qual.Nullable;
24 24 import org.springframework.beans.factory.annotation.Autowired;
25   -import org.springframework.context.event.EventListener;
26 25 import org.springframework.stereotype.Service;
27   -import org.thingsboard.common.util.ThingsBoardThreadFactory;
28 26 import org.thingsboard.server.common.data.alarm.Alarm;
29 27 import org.thingsboard.server.common.data.alarm.AlarmInfo;
30 28 import org.thingsboard.server.common.data.alarm.AlarmQuery;
... ... @@ -35,43 +33,22 @@ import org.thingsboard.server.common.data.id.AlarmId;
35 33 import org.thingsboard.server.common.data.id.CustomerId;
36 34 import org.thingsboard.server.common.data.id.EntityId;
37 35 import org.thingsboard.server.common.data.id.TenantId;
38   -import org.thingsboard.server.common.data.kv.AttributeKvEntry;
39   -import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;
40   -import org.thingsboard.server.common.data.kv.BooleanDataEntry;
41   -import org.thingsboard.server.common.data.kv.DoubleDataEntry;
42   -import org.thingsboard.server.common.data.kv.LongDataEntry;
43   -import org.thingsboard.server.common.data.kv.StringDataEntry;
44   -import org.thingsboard.server.common.data.kv.TsKvEntry;
45 36 import org.thingsboard.server.common.data.page.PageData;
46 37 import org.thingsboard.server.common.data.query.AlarmData;
47   -import org.thingsboard.server.common.data.query.AlarmDataPageLink;
48 38 import org.thingsboard.server.common.data.query.AlarmDataQuery;
49 39 import org.thingsboard.server.common.msg.queue.ServiceType;
50 40 import org.thingsboard.server.common.msg.queue.TbCallback;
51 41 import org.thingsboard.server.common.msg.queue.TopicPartitionInfo;
52 42 import org.thingsboard.server.dao.alarm.AlarmOperationResult;
53 43 import org.thingsboard.server.dao.alarm.AlarmService;
54   -import org.thingsboard.server.dao.attributes.AttributesService;
55   -import org.thingsboard.server.dao.timeseries.TimeseriesService;
56 44 import org.thingsboard.server.gen.transport.TransportProtos;
57   -import org.thingsboard.server.queue.discovery.PartitionChangeEvent;
58 45 import org.thingsboard.server.queue.discovery.PartitionService;
59 46 import org.thingsboard.server.service.queue.TbClusterService;
60 47 import org.thingsboard.server.service.subscription.SubscriptionManagerService;
61 48 import org.thingsboard.server.service.subscription.TbSubscriptionUtils;
62   -import org.thingsboard.server.service.telemetry.sub.AlarmSubscriptionUpdate;
63 49
64   -import javax.annotation.PostConstruct;
65   -import javax.annotation.PreDestroy;
66 50 import java.util.Collection;
67   -import java.util.Collections;
68   -import java.util.List;
69 51 import java.util.Optional;
70   -import java.util.Set;
71   -import java.util.concurrent.ConcurrentHashMap;
72   -import java.util.concurrent.ExecutorService;
73   -import java.util.concurrent.Executors;
74   -import java.util.function.Consumer;
75 52
76 53 /**
77 54 * Created by ashvayka on 27.03.18.
... ... @@ -124,9 +101,15 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService
124 101
125 102 @Override
126 103 public ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) {
  104 + ListenableFuture<AlarmOperationResult> result = clearAlarmAndGetOperationResult(tenantId, alarmId, details, clearTs);
  105 + return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor);
  106 + }
  107 +
  108 + @Override
  109 + public ListenableFuture<AlarmOperationResult> clearAlarmAndGetOperationResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) {
127 110 ListenableFuture<AlarmOperationResult> result = alarmService.clearAlarm(tenantId, alarmId, details, clearTs);
128 111 Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor);
129   - return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor);
  112 + return result;
130 113 }
131 114
132 115 @Override
... ...
... ... @@ -15,7 +15,6 @@
15 15 */
16 16 package org.thingsboard.server.dao.alarm;
17 17
18   -import lombok.AllArgsConstructor;
19 18 import lombok.Data;
20 19 import org.thingsboard.server.common.data.alarm.Alarm;
21 20 import org.thingsboard.server.common.data.id.EntityId;
... ...
... ... @@ -16,7 +16,6 @@
16 16 package org.thingsboard.rule.engine.api;
17 17
18 18 import com.fasterxml.jackson.databind.JsonNode;
19   -import com.google.common.util.concurrent.FutureCallback;
20 19 import com.google.common.util.concurrent.ListenableFuture;
21 20 import org.thingsboard.server.common.data.alarm.Alarm;
22 21 import org.thingsboard.server.common.data.alarm.AlarmInfo;
... ... @@ -28,15 +27,12 @@ import org.thingsboard.server.common.data.id.AlarmId;
28 27 import org.thingsboard.server.common.data.id.CustomerId;
29 28 import org.thingsboard.server.common.data.id.EntityId;
30 29 import org.thingsboard.server.common.data.id.TenantId;
31   -import org.thingsboard.server.common.data.kv.AttributeKvEntry;
32   -import org.thingsboard.server.common.data.kv.TsKvEntry;
33 30 import org.thingsboard.server.common.data.page.PageData;
34 31 import org.thingsboard.server.common.data.query.AlarmData;
35   -import org.thingsboard.server.common.data.query.AlarmDataPageLink;
36 32 import org.thingsboard.server.common.data.query.AlarmDataQuery;
  33 +import org.thingsboard.server.dao.alarm.AlarmOperationResult;
37 34
38 35 import java.util.Collection;
39   -import java.util.List;
40 36
41 37 /**
42 38 * Created by ashvayka on 02.04.18.
... ... @@ -51,6 +47,8 @@ public interface RuleEngineAlarmService {
51 47
52 48 ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs);
53 49
  50 + ListenableFuture<AlarmOperationResult> clearAlarmAndGetOperationResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs);
  51 +
54 52 ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId);
55 53
56 54 ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type);
... ...
... ... @@ -17,6 +17,7 @@ package org.thingsboard.rule.engine.profile;
17 17
18 18 import com.fasterxml.jackson.databind.JsonNode;
19 19 import com.fasterxml.jackson.databind.node.ObjectNode;
  20 +import com.google.common.util.concurrent.ListenableFuture;
20 21 import lombok.Data;
21 22 import lombok.extern.slf4j.Slf4j;
22 23 import org.apache.commons.lang3.StringUtils;
... ... @@ -39,6 +40,7 @@ import org.thingsboard.server.common.data.query.KeyFilter;
39 40 import org.thingsboard.server.common.msg.TbMsg;
40 41 import org.thingsboard.server.common.msg.TbMsgMetaData;
41 42 import org.thingsboard.server.common.msg.queue.ServiceQueue;
  43 +import org.thingsboard.server.dao.alarm.AlarmOperationResult;
42 44 import org.thingsboard.server.dao.util.mapping.JacksonUtil;
43 45
44 46 import java.util.ArrayList;
... ... @@ -118,8 +120,15 @@ class AlarmState {
118 120 for (AlarmRuleState state : createRulesSortedBySeverityDesc) {
119 121 stateUpdate = clearAlarmState(stateUpdate, state);
120 122 }
121   - ctx.getAlarmService().clearAlarm(ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis());
122   - pushMsg(ctx, new TbAlarmResult(false, false, true, currentAlarm));
  123 + Alarm clearedAlarm;
  124 + try {
  125 + clearedAlarm = ctx.getAlarmService().clearAlarmAndGetOperationResult(
  126 + ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis()
  127 + ).get().getAlarm();
  128 + } catch (InterruptedException | ExecutionException e) {
  129 + throw new RuntimeException(e);
  130 + }
  131 + pushMsg(ctx, new TbAlarmResult(false, false, true, clearedAlarm));
123 132 currentAlarm = null;
124 133 } else if (AlarmEvalResult.FALSE.equals(evalResult)) {
125 134 stateUpdate = clearAlarmState(stateUpdate, clearState);
... ...