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

io.github.xuyao5.dkl.eskits.context.DisruptorBoost Maven / Gradle / Ivy

package io.github.xuyao5.dkl.eskits.context;

import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import com.lmax.disruptor.util.DaemonThreadFactory;
import io.github.xuyao5.dkl.eskits.context.disruptor.*;
import lombok.Builder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * @author Thomas.XU(xuyao)
 * @version 4/07/21 20:33
 */
@Slf4j
@Builder(builderMethodName = "context", buildMethodName = "create")
public final class DisruptorBoost {

    @Builder.Default
    private int bufferSize = 1_024;

    @SafeVarargs
    public final void processZeroArg(Consumer> eventZeroArgConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        process(ringBuffer -> eventZeroArgConsumer.accept(ringBuffer::publishEvent), errorConsumer, eventFactory, isShutdownFinally, handlers);
    }

    @SafeVarargs
    public final void processOneArg(Consumer> eventOneArgConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        process(ringBuffer -> eventOneArgConsumer.accept(ringBuffer::publishEvent), errorConsumer, eventFactory, isShutdownFinally, handlers);
    }

    @SafeVarargs
    public final void processTwoArg(Consumer> eventTwoArgConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        process(ringBuffer -> eventTwoArgConsumer.accept(ringBuffer::publishEvent), errorConsumer, eventFactory, isShutdownFinally, handlers);
    }

    @SafeVarargs
    public final void processThreeArg(Consumer> eventThreeArgConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        process(ringBuffer -> eventThreeArgConsumer.accept(ringBuffer::publishEvent), errorConsumer, eventFactory, isShutdownFinally, handlers);
    }

    @SafeVarargs
    public final void processVararg(Consumer> eventVarargConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        process(ringBuffer -> eventVarargConsumer.accept(ringBuffer::publishEvent), errorConsumer, eventFactory, isShutdownFinally, handlers);
    }

    @SafeVarargs
    private final void process(Consumer> ringBufferConsumer, BiConsumer errorConsumer, EventFactory eventFactory, boolean isShutdownFinally, EventHandler... handlers) {
        Disruptor disruptor = new Disruptor<>(eventFactory, bufferSize, DaemonThreadFactory.INSTANCE, ProducerType.SINGLE, new BlockingWaitStrategy());
        disruptor.handleEventsWith(handlers).then((t, sequence, endOfBatch) -> t = null);
        disruptor.setDefaultExceptionHandler(new ExceptionHandler() {
            @Override
            public void handleEventException(Throwable throwable, long sequence, T t) {
                log.error(StringUtils.join(sequence, '|', t), throwable);
                errorConsumer.accept(sequence, t);
            }

            @Override
            public void handleOnStartException(Throwable throwable) {
                log.error("Exception during onStart()", throwable);
            }

            @Override
            public void handleOnShutdownException(Throwable throwable) {
                log.error("Exception during onShutdown()", throwable);
            }
        });
        try {
            disruptor.start();
            ringBufferConsumer.accept(disruptor.getRingBuffer());
        } finally {
            if (isShutdownFinally) {
                disruptor.shutdown();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy