事件源

持有关注在该消息源上的消息监听器列表,事件发生后通过监听列表进行事件透出。

  1. public class EventSource {
  2. private List<TimeoutEventListener> timeoutEventListeners;
  3. public EventSource() {
  4. timeoutEventListeners = new ArrayList<>();
  5. timeoutEventListeners.add(new SendAlertTimeoutEventListener());
  6. timeoutEventListeners.add(new SendFileTimeoutEventListener());
  7. }
  8. public static void main(String[] args) {
  9. new EventSource().doSomething();
  10. }
  11. public void doSomething(){
  12. LocalDateTime expireDate = LocalDateTime.of(2019, 12, 20, 23, 4);
  13. if (expireDate.isBefore(LocalDateTime.now())){
  14. System.out.println("触发某个业务的超时事件");
  15. publishEvent(new TimeoutEventObject(expireDate));
  16. }
  17. }
  18. private void publishEvent(TimeoutEventObject arg){
  19. for (TimeoutEventListener listener : timeoutEventListeners) {
  20. listener.onTimeout(arg);
  21. }
  22. }
  23. }

监听器

TimeoutEventObject是事件对象,可以定义事件需要透传的属性。 TimeoutEventListener是继承jdk中的EventListener,但这是一个标记接口(无任何规范接口)。 SendAlertTimeoutEventListener和SendFileTimeoutEventListener是业务对监听器的不同实现。

  1. public interface TimeoutEventListener extends EventListener {
  2. void onTimeout(TimeoutEventObject eventObject);
  3. }
  4. public class SendAlertTimeoutEventListener implements TimeoutEventListener {
  5. @Override
  6. public void onTimeout(TimeoutEventObject eventObject) {
  7. System.out.println("发送过期消息给钉钉,过期时间:"+eventObject.getExpireDate());
  8. }
  9. }
  10. public class SendFileTimeoutEventListener implements TimeoutEventListener {
  11. @Override
  12. public void onTimeout(TimeoutEventObject eventObject) {
  13. System.out.println("发送过期消息给文件,过期时间:"+eventObject.getExpireDate());
  14. }
  15. }
  16. public class TimeoutEventObject extends EventObject {
  17. private LocalDateTime expireDate;
  18. public LocalDateTime getExpireDate() {
  19. return expireDate;
  20. }
  21. public void setExpireDate(LocalDateTime expireDate) {
  22. this.expireDate = expireDate;
  23. }
  24. /**
  25. * Constructs a prototypical Event.
  26. *
  27. * @param source The object on which the Event initially occurred.
  28. * @throws IllegalArgumentException if source is null.
  29. */
  30. public TimeoutEventObject(Object source) {
  31. super(source);
  32. this.expireDate = (LocalDateTime)source;
  33. }
  34. }