From 11781bb601242a9e8206a641d6671c8d012e72a3 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Thu, 3 Nov 2022 13:18:21 +0200 Subject: [PATCH] alarm service optimization - remove async().get() calls from synchronous methods --- .../server/dao/alarm/AlarmDao.java | 6 ++- .../server/dao/alarm/BaseAlarmService.java | 53 ++++++++----------- .../server/dao/sql/alarm/JpaAlarmDao.java | 24 ++++++--- .../server/dao/sql/alarm/JpaAlarmDaoTest.java | 2 +- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java index 35766e707a..87788d1b2b 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java @@ -42,7 +42,11 @@ import java.util.UUID; */ public interface AlarmDao extends Dao { - ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); + Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); + + ListenableFuture findLatestByOriginatorAndTypeAsync(TenantId tenantId, EntityId originator, String type); + + Alarm findAlarmById(TenantId tenantId, UUID key); ListenableFuture findAlarmByIdAsync(TenantId tenantId, UUID key); diff --git a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java index 7addad7051..1316e52405 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java @@ -114,7 +114,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } alarm.setCustomerId(entityService.fetchEntityCustomerId(alarm.getTenantId(), alarm.getOriginator())); if (alarm.getId() == null) { - Alarm existing = alarmDao.findLatestByOriginatorAndType(alarm.getTenantId(), alarm.getOriginator(), alarm.getType()).get(); + Alarm existing = alarmDao.findLatestByOriginatorAndType(alarm.getTenantId(), alarm.getOriginator(), alarm.getType()); if (existing == null || existing.getStatus().isCleared()) { if (!alarmCreationEnabled) { throw new ApiUsageLimitsExceededException("Alarms creation is disabled"); @@ -124,7 +124,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ return updateAlarm(existing, alarm); } } else { - return updateAlarm(alarm).get(); + return updateAlarm(alarm); } } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); @@ -132,7 +132,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { - return alarmDao.findLatestByOriginatorAndType(tenantId, originator, type); + return alarmDao.findLatestByOriginatorAndTypeAsync(tenantId, originator, type); } @Override @@ -145,19 +145,15 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ @Override @Transactional public AlarmOperationResult deleteAlarm(TenantId tenantId, AlarmId alarmId) { - try { - log.debug("Deleting Alarm Id: {}", alarmId); - Alarm alarm = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()).get(); - if (alarm == null) { - return new AlarmOperationResult(alarm, false); - } - AlarmOperationResult result = new AlarmOperationResult(alarm, true, new ArrayList<>(getPropagationEntityIds(alarm))); - deleteEntityRelations(tenantId, alarm.getId()); - alarmDao.removeById(tenantId, alarm.getUuidId()); - return result; - } catch (ExecutionException | InterruptedException e) { - throw new RuntimeException(e); + log.debug("Deleting Alarm Id: {}", alarmId); + Alarm alarm = alarmDao.findAlarmById(tenantId, alarmId.getId()); + if (alarm == null) { + return new AlarmOperationResult(alarm, false); } + AlarmOperationResult result = new AlarmOperationResult(alarm, true, new ArrayList<>(getPropagationEntityIds(alarm))); + deleteEntityRelations(tenantId, alarm.getId()); + alarmDao.removeById(tenantId, alarm.getUuidId()); + return result; } private AlarmOperationResult createAlarm(Alarm alarm) throws InterruptedException, ExecutionException { @@ -197,19 +193,10 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ return relations.map(EntityRelation::getFrom).collect(Collectors.toCollection(LinkedHashSet::new)); } - private ListenableFuture updateAlarm(Alarm update) { + private AlarmOperationResult updateAlarm(Alarm update) { alarmDataValidator.validate(update, Alarm::getTenantId); - return getAndUpdate(update.getTenantId(), update.getId(), new Function() { - @Nullable - @Override - public AlarmOperationResult apply(@Nullable Alarm alarm) { - if (alarm == null) { - return null; - } else { - return updateAlarm(alarm, update); - } - } - }); + return getAndUpdate(update.getTenantId(), update.getId(), + (alarm) -> alarm == null ? null : updateAlarm(alarm, update)); } private AlarmOperationResult updateAlarm(Alarm oldAlarm, Alarm newAlarm) { @@ -233,7 +220,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ @Override public ListenableFuture ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTime) { - return getAndUpdate(tenantId, alarmId, new Function() { + return getAndUpdateAsync(tenantId, alarmId, new Function() { @Nullable @Override public AlarmOperationResult apply(@Nullable Alarm alarm) { @@ -253,7 +240,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ @Override public ListenableFuture clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTime) { - return getAndUpdate(tenantId, alarmId, new Function() { + return getAndUpdateAsync(tenantId, alarmId, new Function() { @Nullable @Override public AlarmOperationResult apply(@Nullable Alarm alarm) { @@ -404,9 +391,15 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ } } - private ListenableFuture getAndUpdate(TenantId tenantId, AlarmId alarmId, Function function) { + private ListenableFuture getAndUpdateAsync(TenantId tenantId, AlarmId alarmId, Function function) { validateId(alarmId, "Alarm id should be specified!"); ListenableFuture entity = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()); return Futures.transform(entity, function, readResultsProcessingExecutor); } + + private T getAndUpdate(TenantId tenantId, AlarmId alarmId, Function function) { + validateId(alarmId, "Alarm id should be specified!"); + Alarm entity = alarmDao.findAlarmById(tenantId, alarmId.getId()); + return function.apply(entity); + } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java index dc08d755b2..407f7658fe 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java @@ -79,14 +79,22 @@ public class JpaAlarmDao extends JpaAbstractDao implements A } @Override - public ListenableFuture findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { - return service.submit(() -> { - List latest = alarmRepository.findLatestByOriginatorAndType( - originator.getId(), - type, - PageRequest.of(0, 1)); - return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0)); - }); + public Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { + List latest = alarmRepository.findLatestByOriginatorAndType( + originator.getId(), + type, + PageRequest.of(0, 1)); + return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0)); + } + + @Override + public ListenableFuture findLatestByOriginatorAndTypeAsync(TenantId tenantId, EntityId originator, String type) { + return service.submit(() -> findLatestByOriginatorAndType(tenantId, originator, type)); + } + + @Override + public Alarm findAlarmById(TenantId tenantId, UUID key) { + return findById(tenantId, key); } @Override diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java index 941c2d01ac..32ac8a0470 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java @@ -63,7 +63,7 @@ public class JpaAlarmDaoTest extends AbstractJpaDaoTest { int alarmCountAfterSave = alarmDao.find(TenantId.fromUUID(tenantId)).size(); assertEquals(3, alarmCountAfterSave - alarmCountBeforeSave); ListenableFuture future = alarmDao - .findLatestByOriginatorAndType(TenantId.fromUUID(tenantId), new DeviceId(originator1Id), "TEST_ALARM"); + .findLatestByOriginatorAndTypeAsync(TenantId.fromUUID(tenantId), new DeviceId(originator1Id), "TEST_ALARM"); Alarm alarm = future.get(30, TimeUnit.SECONDS); assertNotNull(alarm); assertEquals(alarm2Id, alarm.getId().getId());