事件源
持有关注在该消息源上的消息监听器列表,事件发生后通过监听列表进行事件透出。
public class EventSource {
private List<TimeoutEventListener> timeoutEventListeners;
public EventSource() {
timeoutEventListeners = new ArrayList<>();
timeoutEventListeners.add(new SendAlertTimeoutEventListener());
timeoutEventListeners.add(new SendFileTimeoutEventListener());
}
public static void main(String[] args) {
new EventSource().doSomething();
}
public void doSomething(){
LocalDateTime expireDate = LocalDateTime.of(2019, 12, 20, 23, 4);
if (expireDate.isBefore(LocalDateTime.now())){
System.out.println("触发某个业务的超时事件");
publishEvent(new TimeoutEventObject(expireDate));
}
}
private void publishEvent(TimeoutEventObject arg){
for (TimeoutEventListener listener : timeoutEventListeners) {
listener.onTimeout(arg);
}
}
}
监听器
TimeoutEventObject是事件对象,可以定义事件需要透传的属性。 TimeoutEventListener是继承jdk中的EventListener,但这是一个标记接口(无任何规范接口)。 SendAlertTimeoutEventListener和SendFileTimeoutEventListener是业务对监听器的不同实现。
public interface TimeoutEventListener extends EventListener {
void onTimeout(TimeoutEventObject eventObject);
}
public class SendAlertTimeoutEventListener implements TimeoutEventListener {
@Override
public void onTimeout(TimeoutEventObject eventObject) {
System.out.println("发送过期消息给钉钉,过期时间:"+eventObject.getExpireDate());
}
}
public class SendFileTimeoutEventListener implements TimeoutEventListener {
@Override
public void onTimeout(TimeoutEventObject eventObject) {
System.out.println("发送过期消息给文件,过期时间:"+eventObject.getExpireDate());
}
}
public class TimeoutEventObject extends EventObject {
private LocalDateTime expireDate;
public LocalDateTime getExpireDate() {
return expireDate;
}
public void setExpireDate(LocalDateTime expireDate) {
this.expireDate = expireDate;
}
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public TimeoutEventObject(Object source) {
super(source);
this.expireDate = (LocalDateTime)source;
}
}