报警相关抽象
This commit is contained in:
parent
26e1b92726
commit
32b90339d3
92
src/main/java/club/joylink/xiannccda/alert/Alert.java
Normal file
92
src/main/java/club/joylink/xiannccda/alert/Alert.java
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警
|
||||||
|
*/
|
||||||
|
public class Alert {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警主题监听Map(事件触发式报警)
|
||||||
|
*/
|
||||||
|
static Map<String, List<AlertListener>> AlertConsumerMap = new ConcurrentHashMap<>();
|
||||||
|
/**
|
||||||
|
* 报警监控任务(循环监测式报警)
|
||||||
|
*/
|
||||||
|
static List<AlertMonitoringTask> Amts = new ArrayList<>();
|
||||||
|
/**
|
||||||
|
* 任务执行线程池
|
||||||
|
*/
|
||||||
|
static ScheduledExecutorService Executor = Executors.newScheduledThreadPool(2);
|
||||||
|
static boolean started = false;
|
||||||
|
static final int interval = 100; // 执行器默认间隔,单位ms
|
||||||
|
|
||||||
|
public static void registerAlertMonitoringTask(AlertMonitoringTask task) {
|
||||||
|
Amts.add(task);
|
||||||
|
taskStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
synchronized static void taskStart() {
|
||||||
|
if (!started) {
|
||||||
|
started = true;
|
||||||
|
Executor.scheduleAtFixedRate(() -> Amts.forEach((task) -> task.run()),
|
||||||
|
0, interval, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定报警主题监听器
|
||||||
|
*
|
||||||
|
* @param topic
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<AlertListener> getAlertConsumers(String topic) {
|
||||||
|
List<AlertListener> list = AlertConsumerMap.get(topic);
|
||||||
|
if (list == null) {
|
||||||
|
list = new ArrayList<>();
|
||||||
|
AlertConsumerMap.put(topic, list);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加指定报警主题监听器
|
||||||
|
*
|
||||||
|
* @param topic
|
||||||
|
* @param consumer
|
||||||
|
*/
|
||||||
|
public static void on(String topic, AlertListener consumer) {
|
||||||
|
List<AlertListener> list = getAlertConsumers(topic);
|
||||||
|
list.add(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除指定报警主题监听器
|
||||||
|
*
|
||||||
|
* @param topic
|
||||||
|
* @param listener
|
||||||
|
*/
|
||||||
|
public static void off(String topic, AlertListener listener) {
|
||||||
|
List<AlertListener> list = getAlertConsumers(topic);
|
||||||
|
list.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用指定报警主题监听器
|
||||||
|
*
|
||||||
|
* @param topic
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
public static void emit(String topic, AlertEvent event) {
|
||||||
|
List<AlertListener> list = getAlertConsumers(topic);
|
||||||
|
list.forEach(consumer -> consumer.accept(event));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
23
src/main/java/club/joylink/xiannccda/alert/AlertEvent.java
Normal file
23
src/main/java/club/joylink/xiannccda/alert/AlertEvent.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.EventObject;
|
||||||
|
|
||||||
|
public abstract class AlertEvent extends EventObject {
|
||||||
|
|
||||||
|
private final LocalDateTime dateTime;
|
||||||
|
/**
|
||||||
|
* Constructs a prototypical Event.
|
||||||
|
*
|
||||||
|
* @param source the object on which the Event initially occurred
|
||||||
|
* @throws IllegalArgumentException if source is null
|
||||||
|
*/
|
||||||
|
public AlertEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
this.dateTime = LocalDateTime.now();
|
||||||
|
}
|
||||||
|
public AlertEvent(Object source, LocalDateTime time) {
|
||||||
|
super(source);
|
||||||
|
this.dateTime = time;
|
||||||
|
}
|
||||||
|
}
|
30
src/main/java/club/joylink/xiannccda/alert/AlertInfo.java
Normal file
30
src/main/java/club/joylink/xiannccda/alert/AlertInfo.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警信息
|
||||||
|
*/
|
||||||
|
public interface AlertInfo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警级别
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String getLevel();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警时间
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
LocalDateTime getAlertTime();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警信息
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String getInfo();
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
public interface AlertListener<AE extends AlertEvent> {
|
||||||
|
void accept(AE event);
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 报警监测任务
|
||||||
|
*/
|
||||||
|
public interface AlertMonitoringTask {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务执行逻辑
|
||||||
|
*/
|
||||||
|
void run();
|
||||||
|
}
|
65
src/test/java/club/joylink/xiannccda/alert/AlertTest.java
Normal file
65
src/test/java/club/joylink/xiannccda/alert/AlertTest.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package club.joylink.xiannccda.alert;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class AlertTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testEvent() {
|
||||||
|
SuppliesRemainInsufficientAlert.init(); // 注册
|
||||||
|
// 发布,此时监听会相应
|
||||||
|
Alert.emit("supplies remain update", new SuppliesCountUpdatedEvent(this, 1));
|
||||||
|
SuppliesRemainInsufficientAlert.clear(); // 移除
|
||||||
|
// 发布,没有监听,不会处理
|
||||||
|
Alert.emit("supplies remain update", new SuppliesCountUpdatedEvent(this, 2));
|
||||||
|
|
||||||
|
// Alert.registerAlertMonitoringTask(() -> {
|
||||||
|
// System.out.println("监测列车晚点");
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
static class TrainDelayAlert implements AlertMonitoringTask {
|
||||||
|
|
||||||
|
int delayTime = 2; // 晚点报警触发时间
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static class SuppliesCountUpdatedEvent extends AlertEvent {
|
||||||
|
|
||||||
|
final int remain;
|
||||||
|
|
||||||
|
public SuppliesCountUpdatedEvent(Object source, int remain) {
|
||||||
|
super(source);
|
||||||
|
this.remain = remain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应急物资匮乏报警
|
||||||
|
*/
|
||||||
|
class SuppliesRemainInsufficientAlert {
|
||||||
|
|
||||||
|
static final int SuppliesAlertMin = 10;
|
||||||
|
static AlertListener<SuppliesCountUpdatedEvent> listener;
|
||||||
|
|
||||||
|
static void init() {
|
||||||
|
listener = (AlertListener<SuppliesCountUpdatedEvent>) event -> {
|
||||||
|
if (event.remain < SuppliesAlertMin) {
|
||||||
|
// 构建并发布物资匮乏报警
|
||||||
|
System.out.println("物资匮乏报警");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Alert.on("supplies remain update", listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clear() {
|
||||||
|
Alert.off("supplies remain update", listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
Subproject commit 51743f0de38e3abf76bc2f6456000a25acbff33e
|
Subproject commit 9aa54608cd592ff96fc506e310fb19caff67f809
|
Loading…
Reference in New Issue
Block a user