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

com.xlvchao.clickhouse.component.ScheduledCheckerAndCleaner Maven / Gradle / Ivy

package com.xlvchao.clickhouse.component;

import com.xlvchao.clickhouse.model.ClickHouseSettings;
import com.xlvchao.clickhouse.util.TableUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.xlvchao.clickhouse.util.ThreadUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.function.Predicate;

public class ScheduledCheckerAndCleaner implements AutoCloseable {
    private static final Logger logger = LoggerFactory.getLogger(ScheduledCheckerAndCleaner.class);

    private final ScheduledExecutorService scheduledExecutorService;
    private final List clickHouseSinkBuffers = new ArrayList<>();
    private final List> futures;
    private final Predicate> filter;


    public ScheduledCheckerAndCleaner(ClickHouseSettings clickHouseSettings, List> futures) {
        this.futures = futures;
        this.filter = getFuturesFilter(clickHouseSettings.isIgnoreSinkExceptionEnabled());

        ThreadFactory factory = ThreadUtil.threadFactory("scheduled-checker-and-cleaner");
        this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(factory);
        this.scheduledExecutorService.scheduleWithFixedDelay(getTask(), clickHouseSettings.getWriteTimeout(), clickHouseSettings.getWriteTimeout(), TimeUnit.SECONDS);
    }

    public void addSinkBuffer(ClickHouseSinkBuffer clickHouseSinkBuffer) {
        synchronized (this) {
            clickHouseSinkBuffers.add(clickHouseSinkBuffer);
        }
        logger.debug("Add clickHouseSinkBuffer success, target table = {}", TableUtil.getTableName(clickHouseSinkBuffer.getClazz()));
    }

    private Runnable getTask() {
        return () -> {
            synchronized (this) {
                logger.debug("I am doing cleanup futures and checkup clickHouseSinkBuffers!");
                futures.removeIf(filter);
                clickHouseSinkBuffers.forEach(ClickHouseSinkBuffer::tryAddToCommonQueue);
            }
        };
    }

    private static Predicate> getFuturesFilter(boolean ignoringExceptionEnabled) {
        if (ignoringExceptionEnabled) {
            return CompletableFuture::isDone;
        } else {
            return f -> f.isDone() && !f.isCompletedExceptionally();
        }
    }

    @Override
    public void close() throws Exception {
        logger.info("ScheduledCheckerAndCleaner is shutting down...");
        ThreadUtil.shutdownExecutorService(scheduledExecutorService);
        logger.info("ScheduledCheckerAndCleaner shutdown complete!");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy