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

com.github.phantomthief.collection.impl.BackPressureHandler Maven / Gradle / Ivy

There is a newer version: 0.2.5
Show newest version
package com.github.phantomthief.collection.impl;

import static java.lang.System.nanoTime;

import java.util.concurrent.locks.Condition;

import javax.annotation.Nullable;

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

/**
 * @author w.vela
 * Created on 2019-07-30.
 */
class BackPressureHandler implements RejectHandler {

    private static final Logger logger = LoggerFactory.getLogger(BackPressureHandler.class);

    private static GlobalBackPressureListener globalBackPressureListener = null;

    @Nullable
    private final BackPressureListener listener;
    private String name;

    BackPressureHandler(BackPressureListener listener) {
        this.listener = listener;
    }

    void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean onReject(T element, @Nullable Condition condition) {
        if (listener != null) {
            try {
                listener.onHandle(element);
            } catch (Throwable e) {
                logger.error("", e);
            }
        }
        if (globalBackPressureListener != null) {
            try {
                globalBackPressureListener.onHandle(name, element);
            } catch (Throwable e) {
                logger.error("", e);
            }
        }
        assert condition != null;
        long startNano = nanoTime();
        condition.awaitUninterruptibly();
        long blockInNano = nanoTime() - startNano;
        if (globalBackPressureListener != null) {
            try {
                globalBackPressureListener.postHandle(name, element, blockInNano);
            } catch (Throwable e) {
                logger.error("", e);
            }
        }
        return true;
    }

    static void setupGlobalBackPressureListener(GlobalBackPressureListener listener) {
        globalBackPressureListener = listener;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy