队列快满时触发事件

时间:2018-11-19 11:00:00

标签: java events data-structures event-listener blockingqueue

我有一个用例,其中用大量数据填充blocking queue。 现在,我想在此队列的90%(任意值)已满时触发一个事件(调用方法)。

我想要实现这一点,以便可以对队列中的批量数据执行操作。

为此,我正在考虑扩展BlockingQueueLinkedBlockingQueue的实现之一,并覆盖put(...)方法,并执行类似的操作:

...
@Override
public void put(E e) {
    super.put(e);
    if(this.percentageUsed() >= 90)
        fireEvent(this);
}
...

并在BlockingQueue方法中编写处理fireEvent对象的逻辑。

使用调度程序轮询每个n seconds的队列大小可以很好地做到这一点,但是如果我的应用程序中有许多这样的队列,它将造成混乱,无法处理所有调度程序。而且,这种方法会将所有内容保存在单个类文件中,并且代码更简洁。

请提供对此方法的专家见解。

1 个答案:

答案 0 :(得分:0)

万一有人遇到类似的问题,我最终写了以下课程:

public class EventBlockingQueue<E> extends LinkedBlockingQueue<E> {

    private static final long serialVersionUID = 1L;
    private final int capacity;
    private double eventThreshold;
    private transient Consumer<EventBlockingQueue<E>> eventHandler;

    /**
     * 
     * @param capacity 
     * @param eventThreshold percentage value X (X => {X∈Z    1<=X<=100} ) at which the event is fired
     * @param eventHandler method to be fired at threshold barrier
     */
    public EventBlockingQueue(int capacity, double eventThreshold, Consumer eventHandler) {
        super(capacity);
        this.capacity = capacity;
        this.eventThreshold = eventThreshold;
        this.eventHandler = eventHandler;
    }

    @Override
    public boolean add(E e) {
        boolean addResult = super.add(e);
        if(percentageUsed()>=eventThreshold && eventHandler!=null)
            eventHandler.accept(this);
        return addResult;
    }

    private int percentageUsed() {
        return size()*100/capacity;
    }


}