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

com.github.df.restypass.event.EventBus Maven / Gradle / Ivy

package com.github.df.restypass.event;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;

/**
 * 事件总线
 * Created by darrenfu on 17-7-23.
 */
@SuppressWarnings("WeakerAccess")
public class EventBus {
    private static final Logger log = LoggerFactory.getLogger(EventBus.class);

    /**
     * 事件-消费者缓存(eventKey->Consumer)
     */
    //TODO 注意应用场景,在常驻对象上使用,否则可能存在内存泄漏
    private static ConcurrentHashMap> eventMap = new ConcurrentHashMap<>();

    /**
     * 注册事件和消费者
     *
     * @param event    the event
     * @param consumer the consumer
     */
    static void registerEventAndConsumer(String event, Consumer consumer) {
        // 不存在 event
        if (!eventMap.containsKey(event)) {
            //
            List consumerList = new CopyOnWriteArrayList<>();
            consumerList.add(consumer);
            // 新增
            List existConsumers = eventMap.putIfAbsent(event, consumerList);
            if (existConsumers != null) {
                // 并发,新增
                existConsumers.add(consumer);
            }
        } else {
            // event已存在
            List consumerList = eventMap.get(event);
            if (consumerList != null) {
                consumerList.add(consumer);
            }
        }
        if (log.isTraceEnabled()) {
            log.trace("注册事件:{}成功", event);
        }
    }

    /**
     * 消费事件
     *
     * @param    the type parameter
     * @param event the event
     * @param obj   the obj
     */
    @SuppressWarnings("unchecked")
    static  void emitEvent(String event, T obj) {

        List consumers = eventMap.get(event);
        if (consumers != null && consumers.size() > 0) {
            for (Consumer consumer : consumers) {
                consumer.accept(obj);
            }
        }
        if (log.isTraceEnabled()) {
            log.trace("消费事件:{},参数:{}", event, obj);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy