Commit 80b850add88c4e08973103610deec3f27b959952
Merge branch 'master' of github.com:thingsboard/thingsboard
Showing
6 changed files
with
26 additions
and
37 deletions
@@ -437,6 +437,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService | @@ -437,6 +437,7 @@ public class SqlDatabaseUpgradeService implements DatabaseEntitiesUpgradeService | ||
437 | case "3.2.1": | 437 | case "3.2.1": |
438 | try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { | 438 | try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { |
439 | log.info("Updating schema ..."); | 439 | log.info("Updating schema ..."); |
440 | + conn.createStatement().execute("CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time);"); | ||
440 | schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.2.1", SCHEMA_UPDATE_SQL); | 441 | schemaUpdateFile = Paths.get(installScripts.getDataDir(), "upgrade", "3.2.1", SCHEMA_UPDATE_SQL); |
441 | loadSql(schemaUpdateFile, conn); | 442 | loadSql(schemaUpdateFile, conn); |
442 | conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3002002;"); | 443 | conn.createStatement().execute("UPDATE tb_schema_settings SET schema_version = 3002002;"); |
@@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture; | @@ -22,9 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture; | ||
22 | import lombok.extern.slf4j.Slf4j; | 22 | import lombok.extern.slf4j.Slf4j; |
23 | import org.checkerframework.checker.nullness.qual.Nullable; | 23 | import org.checkerframework.checker.nullness.qual.Nullable; |
24 | import org.springframework.beans.factory.annotation.Autowired; | 24 | import org.springframework.beans.factory.annotation.Autowired; |
25 | -import org.springframework.context.event.EventListener; | ||
26 | import org.springframework.stereotype.Service; | 25 | import org.springframework.stereotype.Service; |
27 | -import org.thingsboard.common.util.ThingsBoardThreadFactory; | ||
28 | import org.thingsboard.server.common.data.alarm.Alarm; | 26 | import org.thingsboard.server.common.data.alarm.Alarm; |
29 | import org.thingsboard.server.common.data.alarm.AlarmInfo; | 27 | import org.thingsboard.server.common.data.alarm.AlarmInfo; |
30 | import org.thingsboard.server.common.data.alarm.AlarmQuery; | 28 | import org.thingsboard.server.common.data.alarm.AlarmQuery; |
@@ -35,43 +33,22 @@ import org.thingsboard.server.common.data.id.AlarmId; | @@ -35,43 +33,22 @@ import org.thingsboard.server.common.data.id.AlarmId; | ||
35 | import org.thingsboard.server.common.data.id.CustomerId; | 33 | import org.thingsboard.server.common.data.id.CustomerId; |
36 | import org.thingsboard.server.common.data.id.EntityId; | 34 | import org.thingsboard.server.common.data.id.EntityId; |
37 | import org.thingsboard.server.common.data.id.TenantId; | 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 | import org.thingsboard.server.common.data.page.PageData; | 36 | import org.thingsboard.server.common.data.page.PageData; |
46 | import org.thingsboard.server.common.data.query.AlarmData; | 37 | import org.thingsboard.server.common.data.query.AlarmData; |
47 | -import org.thingsboard.server.common.data.query.AlarmDataPageLink; | ||
48 | import org.thingsboard.server.common.data.query.AlarmDataQuery; | 38 | import org.thingsboard.server.common.data.query.AlarmDataQuery; |
49 | import org.thingsboard.server.common.msg.queue.ServiceType; | 39 | import org.thingsboard.server.common.msg.queue.ServiceType; |
50 | import org.thingsboard.server.common.msg.queue.TbCallback; | 40 | import org.thingsboard.server.common.msg.queue.TbCallback; |
51 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; | 41 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; |
52 | import org.thingsboard.server.dao.alarm.AlarmOperationResult; | 42 | import org.thingsboard.server.dao.alarm.AlarmOperationResult; |
53 | import org.thingsboard.server.dao.alarm.AlarmService; | 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 | import org.thingsboard.server.gen.transport.TransportProtos; | 44 | import org.thingsboard.server.gen.transport.TransportProtos; |
57 | -import org.thingsboard.server.queue.discovery.PartitionChangeEvent; | ||
58 | import org.thingsboard.server.queue.discovery.PartitionService; | 45 | import org.thingsboard.server.queue.discovery.PartitionService; |
59 | import org.thingsboard.server.service.queue.TbClusterService; | 46 | import org.thingsboard.server.service.queue.TbClusterService; |
60 | import org.thingsboard.server.service.subscription.SubscriptionManagerService; | 47 | import org.thingsboard.server.service.subscription.SubscriptionManagerService; |
61 | import org.thingsboard.server.service.subscription.TbSubscriptionUtils; | 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 | import java.util.Collection; | 50 | import java.util.Collection; |
67 | -import java.util.Collections; | ||
68 | -import java.util.List; | ||
69 | import java.util.Optional; | 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 | * Created by ashvayka on 27.03.18. | 54 | * Created by ashvayka on 27.03.18. |
@@ -124,9 +101,15 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService | @@ -124,9 +101,15 @@ public class DefaultAlarmSubscriptionService extends AbstractSubscriptionService | ||
124 | 101 | ||
125 | @Override | 102 | @Override |
126 | public ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { | 103 | public ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { |
104 | + ListenableFuture<AlarmOperationResult> result = clearAlarmForResult(tenantId, alarmId, details, clearTs); | ||
105 | + return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor); | ||
106 | + } | ||
107 | + | ||
108 | + @Override | ||
109 | + public ListenableFuture<AlarmOperationResult> clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs) { | ||
127 | ListenableFuture<AlarmOperationResult> result = alarmService.clearAlarm(tenantId, alarmId, details, clearTs); | 110 | ListenableFuture<AlarmOperationResult> result = alarmService.clearAlarm(tenantId, alarmId, details, clearTs); |
128 | Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor); | 111 | Futures.addCallback(result, new AlarmUpdateCallback(), wsCallBackExecutor); |
129 | - return Futures.transform(result, AlarmOperationResult::isSuccessful, wsCallBackExecutor); | 112 | + return result; |
130 | } | 113 | } |
131 | 114 | ||
132 | @Override | 115 | @Override |
@@ -15,7 +15,6 @@ | @@ -15,7 +15,6 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.dao.alarm; | 16 | package org.thingsboard.server.dao.alarm; |
17 | 17 | ||
18 | -import lombok.AllArgsConstructor; | ||
19 | import lombok.Data; | 18 | import lombok.Data; |
20 | import org.thingsboard.server.common.data.alarm.Alarm; | 19 | import org.thingsboard.server.common.data.alarm.Alarm; |
21 | import org.thingsboard.server.common.data.id.EntityId; | 20 | import org.thingsboard.server.common.data.id.EntityId; |
@@ -43,3 +43,5 @@ CREATE INDEX IF NOT EXISTS idx_asset_customer_id_and_type ON asset(tenant_id, cu | @@ -43,3 +43,5 @@ CREATE INDEX IF NOT EXISTS idx_asset_customer_id_and_type ON asset(tenant_id, cu | ||
43 | CREATE INDEX IF NOT EXISTS idx_asset_type ON asset(tenant_id, type); | 43 | CREATE INDEX IF NOT EXISTS idx_asset_type ON asset(tenant_id, type); |
44 | 44 | ||
45 | CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribute_kv(entity_id, attribute_key, last_update_ts desc); | 45 | CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribute_kv(entity_id, attribute_key, last_update_ts desc); |
46 | + | ||
47 | +CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time); |
@@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
16 | package org.thingsboard.rule.engine.api; | 16 | package org.thingsboard.rule.engine.api; |
17 | 17 | ||
18 | import com.fasterxml.jackson.databind.JsonNode; | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | -import com.google.common.util.concurrent.FutureCallback; | ||
20 | import com.google.common.util.concurrent.ListenableFuture; | 19 | import com.google.common.util.concurrent.ListenableFuture; |
21 | import org.thingsboard.server.common.data.alarm.Alarm; | 20 | import org.thingsboard.server.common.data.alarm.Alarm; |
22 | import org.thingsboard.server.common.data.alarm.AlarmInfo; | 21 | import org.thingsboard.server.common.data.alarm.AlarmInfo; |
@@ -28,15 +27,12 @@ import org.thingsboard.server.common.data.id.AlarmId; | @@ -28,15 +27,12 @@ import org.thingsboard.server.common.data.id.AlarmId; | ||
28 | import org.thingsboard.server.common.data.id.CustomerId; | 27 | import org.thingsboard.server.common.data.id.CustomerId; |
29 | import org.thingsboard.server.common.data.id.EntityId; | 28 | import org.thingsboard.server.common.data.id.EntityId; |
30 | import org.thingsboard.server.common.data.id.TenantId; | 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 | import org.thingsboard.server.common.data.page.PageData; | 30 | import org.thingsboard.server.common.data.page.PageData; |
34 | import org.thingsboard.server.common.data.query.AlarmData; | 31 | import org.thingsboard.server.common.data.query.AlarmData; |
35 | -import org.thingsboard.server.common.data.query.AlarmDataPageLink; | ||
36 | import org.thingsboard.server.common.data.query.AlarmDataQuery; | 32 | import org.thingsboard.server.common.data.query.AlarmDataQuery; |
33 | +import org.thingsboard.server.dao.alarm.AlarmOperationResult; | ||
37 | 34 | ||
38 | import java.util.Collection; | 35 | import java.util.Collection; |
39 | -import java.util.List; | ||
40 | 36 | ||
41 | /** | 37 | /** |
42 | * Created by ashvayka on 02.04.18. | 38 | * Created by ashvayka on 02.04.18. |
@@ -51,6 +47,8 @@ public interface RuleEngineAlarmService { | @@ -51,6 +47,8 @@ public interface RuleEngineAlarmService { | ||
51 | 47 | ||
52 | ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); | 48 | ListenableFuture<Boolean> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); |
53 | 49 | ||
50 | + ListenableFuture<AlarmOperationResult> clearAlarmForResult(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTs); | ||
51 | + | ||
54 | ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId); | 52 | ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, AlarmId alarmId); |
55 | 53 | ||
56 | ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); | 54 | ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); |
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java
@@ -17,28 +17,26 @@ package org.thingsboard.rule.engine.profile; | @@ -17,28 +17,26 @@ package org.thingsboard.rule.engine.profile; | ||
17 | 17 | ||
18 | import com.fasterxml.jackson.databind.JsonNode; | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | import com.fasterxml.jackson.databind.node.ObjectNode; | 19 | import com.fasterxml.jackson.databind.node.ObjectNode; |
20 | +import com.google.common.util.concurrent.ListenableFuture; | ||
20 | import lombok.Data; | 21 | import lombok.Data; |
21 | import lombok.extern.slf4j.Slf4j; | 22 | import lombok.extern.slf4j.Slf4j; |
22 | import org.apache.commons.lang3.StringUtils; | 23 | import org.apache.commons.lang3.StringUtils; |
24 | +import org.thingsboard.common.util.DonAsynchron; | ||
23 | import org.thingsboard.rule.engine.action.TbAlarmResult; | 25 | import org.thingsboard.rule.engine.action.TbAlarmResult; |
24 | import org.thingsboard.rule.engine.api.TbContext; | 26 | import org.thingsboard.rule.engine.api.TbContext; |
25 | import org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState; | 27 | import org.thingsboard.rule.engine.profile.state.PersistedAlarmRuleState; |
26 | import org.thingsboard.rule.engine.profile.state.PersistedAlarmState; | 28 | import org.thingsboard.rule.engine.profile.state.PersistedAlarmState; |
27 | import org.thingsboard.server.common.data.DataConstants; | 29 | import org.thingsboard.server.common.data.DataConstants; |
28 | -import org.thingsboard.server.common.data.Tenant; | ||
29 | import org.thingsboard.server.common.data.alarm.Alarm; | 30 | import org.thingsboard.server.common.data.alarm.Alarm; |
30 | import org.thingsboard.server.common.data.alarm.AlarmSeverity; | 31 | import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
31 | import org.thingsboard.server.common.data.alarm.AlarmStatus; | 32 | import org.thingsboard.server.common.data.alarm.AlarmStatus; |
32 | import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType; | 33 | import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType; |
33 | import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; | 34 | import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; |
34 | -import org.thingsboard.server.common.data.id.CustomerId; | ||
35 | import org.thingsboard.server.common.data.id.EntityId; | 35 | import org.thingsboard.server.common.data.id.EntityId; |
36 | -import org.thingsboard.server.common.data.id.TenantId; | ||
37 | -import org.thingsboard.server.common.data.query.EntityKeyType; | ||
38 | -import org.thingsboard.server.common.data.query.KeyFilter; | ||
39 | import org.thingsboard.server.common.msg.TbMsg; | 36 | import org.thingsboard.server.common.msg.TbMsg; |
40 | import org.thingsboard.server.common.msg.TbMsgMetaData; | 37 | import org.thingsboard.server.common.msg.TbMsgMetaData; |
41 | import org.thingsboard.server.common.msg.queue.ServiceQueue; | 38 | import org.thingsboard.server.common.msg.queue.ServiceQueue; |
39 | +import org.thingsboard.server.dao.alarm.AlarmOperationResult; | ||
42 | import org.thingsboard.server.dao.util.mapping.JacksonUtil; | 40 | import org.thingsboard.server.dao.util.mapping.JacksonUtil; |
43 | 41 | ||
44 | import java.util.ArrayList; | 42 | import java.util.ArrayList; |
@@ -118,8 +116,16 @@ class AlarmState { | @@ -118,8 +116,16 @@ class AlarmState { | ||
118 | for (AlarmRuleState state : createRulesSortedBySeverityDesc) { | 116 | for (AlarmRuleState state : createRulesSortedBySeverityDesc) { |
119 | stateUpdate = clearAlarmState(stateUpdate, state); | 117 | stateUpdate = clearAlarmState(stateUpdate, state); |
120 | } | 118 | } |
121 | - ctx.getAlarmService().clearAlarm(ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis()); | ||
122 | - pushMsg(ctx, new TbAlarmResult(false, false, true, currentAlarm)); | 119 | + ListenableFuture<AlarmOperationResult> alarmClearOperationResult = ctx.getAlarmService().clearAlarmForResult( |
120 | + ctx.getTenantId(), currentAlarm.getId(), createDetails(clearState), System.currentTimeMillis() | ||
121 | + ); | ||
122 | + DonAsynchron.withCallback(alarmClearOperationResult, | ||
123 | + result -> { | ||
124 | + pushMsg(ctx, new TbAlarmResult(false, false, true, result.getAlarm())); | ||
125 | + }, | ||
126 | + throwable -> { | ||
127 | + throw new RuntimeException(throwable); | ||
128 | + }); | ||
123 | currentAlarm = null; | 129 | currentAlarm = null; |
124 | } else if (AlarmEvalResult.FALSE.equals(evalResult)) { | 130 | } else if (AlarmEvalResult.FALSE.equals(evalResult)) { |
125 | stateUpdate = clearAlarmState(stateUpdate, clearState); | 131 | stateUpdate = clearAlarmState(stateUpdate, clearState); |