Событие пожара, когда очередь почти заполнена - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть сценарий использования, когда я заполняю свой blocking queue большим количеством данных. Теперь я хочу запустить событие (вызвать метод), когда эта очередь заполнится на 90% ( произвольное значение ).

Я хочу добиться этого, чтобы можно было выполнить операцию с массивными данными из очереди.

Для этого я подумываю о расширении одной из реализаций BlockingQueue, такой как LinkedBlockingQueue, и переопределении метода put(...) и сделать что-то вроде:

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

И напишите мою логику, чтобы иметь дело с объектом BlockingQueue в методе fireEvent.

Это вполне можно сделать, используя планировщик для опроса размера очереди каждые n seconds, но если бы в моем приложении было много таких очередей, это создало бы хаос для обработки всех планировщиков. Кроме того, этот подход позволил бы хранить все в одном файле класса и иметь более чистый код.

Пожалуйста, предоставьте экспертную информацию об этом подходе.

1 Ответ

0 голосов
/ 03 мая 2019

На случай, если у кого-то возникла подобная проблема, я написал следующий класс:

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;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...