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

tech.ydb.core.impl.YdbSchedulerFactory Maven / Gradle / Ivy

package tech.ydb.core.impl;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

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

/**
 *
 * @author Aleksandr Gorshenin
 */
public class YdbSchedulerFactory {
    private static final long WAIT_FOR_SHUTDOWN_MS = 1000;

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

    private YdbSchedulerFactory() { }

    public static ScheduledExecutorService createScheduler() {
        // default size of ydb shared scheduler
        int threads = Math.max(Runtime.getRuntime().availableProcessors() / 2, 2);
        return Executors.newScheduledThreadPool(threads, new YdbThreadFactory());
    }

    public static boolean shutdownScheduler(ScheduledExecutorService scheduler) {
        try {
            scheduler.shutdown();
            boolean closed = scheduler.awaitTermination(WAIT_FOR_SHUTDOWN_MS, TimeUnit.MILLISECONDS);
            if (!closed) {
                logger.warn("ydb scheduler shutdown timeout exceeded, terminate");
                for (Runnable task: scheduler.shutdownNow()) {
                    logger.warn("   task {} is terminated", task);
                }
                closed = scheduler.awaitTermination(WAIT_FOR_SHUTDOWN_MS, TimeUnit.MILLISECONDS);
                if (!closed) {
                    logger.warn("ydb scheduler shutdown problem");
                }
            }

            return closed;
        } catch (InterruptedException e) {
            logger.warn("ydb scheduler shutdown interrupted", e);
            Thread.currentThread().interrupt();
            return false;
        }
    }

    private static class YdbThreadFactory implements ThreadFactory {
        private static final AtomicInteger INSTANCE_COUNT = new AtomicInteger(1);

        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        YdbThreadFactory() {
            namePrefix = "ydb-scheduler-" +
                          INSTANCE_COUNT.getAndIncrement() +
                         "-thread-";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, namePrefix + threadNumber.getAndIncrement());
            t.setDaemon(true);
            return t;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy