public int sendAlarm(final AlarmInfo alarmInfo) { AlarmType type = alarmInfo.type; String id = alarmInfo.getId(); String extraInfo = alarmInfo.getExtraInfo(); if (terminationToken.isToShutdown()) { // 记录告警信息 System.err.println("rejected alarm:" + id + "," + extraInfo); return -1; } int duplicateSubmissionCount = 0; try { AtomicInteger prevSubmittedCounter; prevSubmittedCounter = submittedAlarmRegistry.putIfAbsent( type.toString() + ':' + id + '@' + extraInfo, new AtomicInteger(0)); if (null == prevSubmittedCounter) { terminationToken.reservations.incrementAndGet(); alarmQueue.put(alarmInfo); } else { // 故障未恢复,不用重复发送告警信息给服务器,故仅增加计数 duplicateSubmissionCount = prevSubmittedCounter.incrementAndGet(); } } catch (Throwable t) { t.printStackTrace(); } return duplicateSubmissionCount; }
@Override protected void doRun() throws Exception { AlarmInfo alarm; alarm = alarmQueue.take(); terminationToken.reservations.decrementAndGet(); try { // 将告警信息发送至告警服务器 alarmAgent.sendAlarm(alarm); } catch (Exception e) { e.printStackTrace(); } /* * 处理恢复告警:将相应的故障告警从注册表中删除, 使得相应故障恢复后若再次出现相同故障,该故障信息能够上报到服务器 */ if (AlarmType.RESUME == alarm.type) { String key = AlarmType.FAULT.toString() + ':' + alarm.getId() + '@' + alarm.getExtraInfo(); submittedAlarmRegistry.remove(key); key = AlarmType.RESUME.toString() + ':' + alarm.getId() + '@' + alarm.getExtraInfo(); submittedAlarmRegistry.remove(key); } }