@Override
@Transactional(value = "cacheTransactionManager", propagation=Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void doRemoveRuleTag(final Long id, final ConfigurationElementReport elementReport) {
LOGGER.trace("Removing RuleTag " + id);
try {
RuleTag ruleTag = tagCache.get(id);
Collection<Long> ruleIds = ruleTag.getCopyRuleIds();
if (!ruleIds.isEmpty()) {
LOGGER.debug("Removing rules dependent on RuleTag " + id);
for (Long ruleId : ruleIds) { //concurrent modifcation as a rule is removed from the list during the remove call!
if (tagLocationService.isInTagCache(ruleId)) { //may already have been removed if a previous rule in the list was used in this rule!
ConfigurationElementReport newReport = new ConfigurationElementReport(Action.REMOVE, Entity.RULETAG, ruleId);
elementReport.addSubReport(newReport);
ruleTagConfigHandler.removeRuleTag(ruleId, newReport); //call config handler bean so transaction annotation is noticed
}
}
}
tagCache.acquireWriteLockOnKey(id);
Collection<Long> ruleInputTagIds = Collections.EMPTY_LIST;
try {
ruleInputTagIds = ruleTag.getCopyRuleInputTagIds();
Collection<Long> alarmIds = ruleTag.getCopyAlarmIds();
if (!alarmIds.isEmpty()) {
LOGGER.debug("Removing Alarms dependent on RuleTag " + id);
for (Long alarmId : alarmIds) { //need copy as modified concurrently by remove alarm
ConfigurationElementReport alarmReport = new ConfigurationElementReport(Action.REMOVE, Entity.ALARM, alarmId);
elementReport.addSubReport(alarmReport);
alarmConfigHandler.removeAlarm(alarmId, alarmReport);
}
}
for (Long inputTagId : ruleInputTagIds) {
tagConfigGateway.removeRuleFromTag(inputTagId, id); //allowed to lock tag below the rule...
}
for (ConfigurationEventListener listener : configurationEventListeners) {
listener.onConfigurationEvent(ruleTag, Action.REMOVE);
}
configurableDAO.deleteItem(ruleTag.getId());
}
catch (RuntimeException rEx) {
String errMessage = "Exception caught when removing rule tag with id " + id;
LOGGER.error(errMessage, rEx);
throw new UnexpectedRollbackException(errMessage, rEx);
} finally {
if (tagCache.isWriteLockedByCurrentThread(id)) {
tagCache.releaseWriteLockOnKey(id);
}
}
} catch (CacheElementNotFoundException e) {
LOGGER.debug("Attempting to remove a non-existent RuleTag - no action taken.");
elementReport.setWarning("Attempting to removed a non-existent RuleTag");
}
}
RuleTagConfigTransactedImpl.java 文件源码
java
阅读 26
收藏 0
点赞 0
评论 0
项目:c2mon
作者:
评论列表
文章目录