All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bekit.event.bus.EventBus Maven / Gradle / Ivy

/* 
 * 作者:钟勋 (e-mail:[email protected])
 */

/*
 * 修订记录:
 * @author 钟勋 2016-12-16 01:14 创建
 */
package org.bekit.event.bus;

import org.bekit.event.extension.EventTypeResolver;
import org.bekit.event.listener.ListenerExecutor;

import java.util.*;

/**
 * 事件总线
 */
public class EventBus {
    // 监听器执行器
    private final List listenerExecutors = new ArrayList<>();
    // 监听器执行器缓存(key:事件类型)
    private Map> listenerExecutorsCache = new HashMap<>();
    // 事件类型解决器
    private final EventTypeResolver resolver;

    public EventBus(EventTypeResolver resolver) {
        this.resolver = resolver;
    }

    /**
     * 注册监听器
     *
     * @param listenerExecutor 监听器执行器
     */
    public void register(ListenerExecutor listenerExecutor) {
        listenerExecutors.add(listenerExecutor);
        Collections.sort(listenerExecutors);
        refreshListenerCache();
    }

    /**
     * 分派事件
     * (先执行优先级升序,再执行优先级降序)
     *
     * @param event 事件
     * @throws Throwable 执行过程中发生任何异常都会往外抛
     */
    public void dispatch(Object event) throws Throwable {
        // 获取该事件类型的监听器缓存
        List theListenerExecutors = listenerExecutorsCache.get(resolver.resolve(event));
        if (theListenerExecutors != null) {
            // 执行监听器
            for (ListenerExecutor listenerExecutor : theListenerExecutors) {
                listenerExecutor.execute(event);
            }
        }
    }

    // 刷新监听器缓存
    private void refreshListenerCache() {
        Map> cache = new HashMap<>();
        // 获取本总线所有的事件类型
        Set eventTypes = new HashSet<>();
        for (ListenerExecutor listenerExecutor : listenerExecutors) {
            eventTypes.addAll(listenerExecutor.getEventTypes(true));
            eventTypes.addAll(listenerExecutor.getEventTypes(false));
        }
        // 根据事件类型设置缓存
        for (Object eventType : eventTypes) {
            // 特定事件类型的监听器缓存
            List theListenerExecutors = new ArrayList<>();
            // 获取指定事件类型的升序监听器
            for (ListenerExecutor listenerExecutor : listenerExecutors) {
                if (listenerExecutor.getEventTypes(true).contains(eventType)) {
                    theListenerExecutors.add(listenerExecutor);
                }
            }
            // 获取指定事件类型的降序监听器
            for (int i = listenerExecutors.size() - 1; i >= 0; i--) {
                ListenerExecutor listenerExecutor = listenerExecutors.get(i);
                if (listenerExecutor.getEventTypes(false).contains(eventType)) {
                    theListenerExecutors.add(listenerExecutor);
                }
            }
            // 设置缓存
            cache.put(eventType, theListenerExecutors);
        }
        // 刷新缓存
        listenerExecutorsCache = cache;
    }
}