Browse Source

alarm service optimization - remove async().get() calls from synchronous methods

pull/7538/head
Sergey Matvienko 4 years ago
parent
commit
11781bb601
  1. 6
      dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java
  2. 53
      dao/src/main/java/org/thingsboard/server/dao/alarm/BaseAlarmService.java
  3. 24
      dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
  4. 2
      dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java

6
dao/src/main/java/org/thingsboard/server/dao/alarm/AlarmDao.java

@ -42,7 +42,11 @@ import java.util.UUID;
*/ */
public interface AlarmDao extends Dao<Alarm> { public interface AlarmDao extends Dao<Alarm> {
ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type); Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type);
ListenableFuture<Alarm> findLatestByOriginatorAndTypeAsync(TenantId tenantId, EntityId originator, String type);
Alarm findAlarmById(TenantId tenantId, UUID key);
ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, UUID key); ListenableFuture<Alarm> findAlarmByIdAsync(TenantId tenantId, UUID key);

53
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())); alarm.setCustomerId(entityService.fetchEntityCustomerId(alarm.getTenantId(), alarm.getOriginator()));
if (alarm.getId() == null) { 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 (existing == null || existing.getStatus().isCleared()) {
if (!alarmCreationEnabled) { if (!alarmCreationEnabled) {
throw new ApiUsageLimitsExceededException("Alarms creation is disabled"); throw new ApiUsageLimitsExceededException("Alarms creation is disabled");
@ -124,7 +124,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
return updateAlarm(existing, alarm); return updateAlarm(existing, alarm);
} }
} else { } else {
return updateAlarm(alarm).get(); return updateAlarm(alarm);
} }
} catch (ExecutionException | InterruptedException e) { } catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -132,7 +132,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
} }
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
return alarmDao.findLatestByOriginatorAndType(tenantId, originator, type); return alarmDao.findLatestByOriginatorAndTypeAsync(tenantId, originator, type);
} }
@Override @Override
@ -145,19 +145,15 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
@Override @Override
@Transactional @Transactional
public AlarmOperationResult deleteAlarm(TenantId tenantId, AlarmId alarmId) { public AlarmOperationResult deleteAlarm(TenantId tenantId, AlarmId alarmId) {
try { log.debug("Deleting Alarm Id: {}", alarmId);
log.debug("Deleting Alarm Id: {}", alarmId); Alarm alarm = alarmDao.findAlarmById(tenantId, alarmId.getId());
Alarm alarm = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()).get(); if (alarm == null) {
if (alarm == null) { return new AlarmOperationResult(alarm, false);
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);
} }
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 { 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)); return relations.map(EntityRelation::getFrom).collect(Collectors.toCollection(LinkedHashSet::new));
} }
private ListenableFuture<AlarmOperationResult> updateAlarm(Alarm update) { private AlarmOperationResult updateAlarm(Alarm update) {
alarmDataValidator.validate(update, Alarm::getTenantId); alarmDataValidator.validate(update, Alarm::getTenantId);
return getAndUpdate(update.getTenantId(), update.getId(), new Function<Alarm, AlarmOperationResult>() { return getAndUpdate(update.getTenantId(), update.getId(),
@Nullable (alarm) -> alarm == null ? null : updateAlarm(alarm, update));
@Override
public AlarmOperationResult apply(@Nullable Alarm alarm) {
if (alarm == null) {
return null;
} else {
return updateAlarm(alarm, update);
}
}
});
} }
private AlarmOperationResult updateAlarm(Alarm oldAlarm, Alarm newAlarm) { private AlarmOperationResult updateAlarm(Alarm oldAlarm, Alarm newAlarm) {
@ -233,7 +220,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
@Override @Override
public ListenableFuture<AlarmOperationResult> ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTime) { public ListenableFuture<AlarmOperationResult> ackAlarm(TenantId tenantId, AlarmId alarmId, long ackTime) {
return getAndUpdate(tenantId, alarmId, new Function<Alarm, AlarmOperationResult>() { return getAndUpdateAsync(tenantId, alarmId, new Function<Alarm, AlarmOperationResult>() {
@Nullable @Nullable
@Override @Override
public AlarmOperationResult apply(@Nullable Alarm alarm) { public AlarmOperationResult apply(@Nullable Alarm alarm) {
@ -253,7 +240,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
@Override @Override
public ListenableFuture<AlarmOperationResult> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTime) { public ListenableFuture<AlarmOperationResult> clearAlarm(TenantId tenantId, AlarmId alarmId, JsonNode details, long clearTime) {
return getAndUpdate(tenantId, alarmId, new Function<Alarm, AlarmOperationResult>() { return getAndUpdateAsync(tenantId, alarmId, new Function<Alarm, AlarmOperationResult>() {
@Nullable @Nullable
@Override @Override
public AlarmOperationResult apply(@Nullable Alarm alarm) { public AlarmOperationResult apply(@Nullable Alarm alarm) {
@ -404,9 +391,15 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ
} }
} }
private <T> ListenableFuture<T> getAndUpdate(TenantId tenantId, AlarmId alarmId, Function<Alarm, T> function) { private <T> ListenableFuture<T> getAndUpdateAsync(TenantId tenantId, AlarmId alarmId, Function<Alarm, T> function) {
validateId(alarmId, "Alarm id should be specified!"); validateId(alarmId, "Alarm id should be specified!");
ListenableFuture<Alarm> entity = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId()); ListenableFuture<Alarm> entity = alarmDao.findAlarmByIdAsync(tenantId, alarmId.getId());
return Futures.transform(entity, function, readResultsProcessingExecutor); return Futures.transform(entity, function, readResultsProcessingExecutor);
} }
private <T> T getAndUpdate(TenantId tenantId, AlarmId alarmId, Function<Alarm, T> function) {
validateId(alarmId, "Alarm id should be specified!");
Alarm entity = alarmDao.findAlarmById(tenantId, alarmId.getId());
return function.apply(entity);
}
} }

24
dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java

@ -79,14 +79,22 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
} }
@Override @Override
public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) { public Alarm findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
return service.submit(() -> { List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType(
List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType( originator.getId(),
originator.getId(), type,
type, PageRequest.of(0, 1));
PageRequest.of(0, 1)); return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0));
return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0)); }
});
@Override
public ListenableFuture<Alarm> 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 @Override

2
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(); int alarmCountAfterSave = alarmDao.find(TenantId.fromUUID(tenantId)).size();
assertEquals(3, alarmCountAfterSave - alarmCountBeforeSave); assertEquals(3, alarmCountAfterSave - alarmCountBeforeSave);
ListenableFuture<Alarm> future = alarmDao ListenableFuture<Alarm> 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); Alarm alarm = future.get(30, TimeUnit.SECONDS);
assertNotNull(alarm); assertNotNull(alarm);
assertEquals(alarm2Id, alarm.getId().getId()); assertEquals(alarm2Id, alarm.getId().getId());

Loading…
Cancel
Save