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

xin.bluesky.leiothrix.server.cache.PartitionTaskContainer Maven / Gradle / Ivy

The newest version!
package xin.bluesky.leiothrix.server.cache;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import xin.bluesky.leiothrix.model.task.partition.PartitionTask;
import xin.bluesky.leiothrix.server.storage.RangeStorage;

import java.util.*;
import java.util.concurrent.*;

/**
 * @author 张轲
 */
public class PartitionTaskContainer {

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

    private static Map map = new ConcurrentHashMap<>();

    private static ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(
            new ThreadFactoryBuilder().setNameFormat("partition-task-cache-%d").build());

    private LinkedBlockingDeque queue = new LinkedBlockingDeque();

    static {
        executorService.scheduleAtFixedRate(new UpdateOwnership(), 18, 15, TimeUnit.SECONDS);
    }

    public synchronized static PartitionTaskContainer getInstance(String taskId) {
        if (map.get(taskId) == null) {
            map.put(taskId, new PartitionTaskContainer());
        }
        return map.get(taskId);
    }

    public synchronized static void evict(String taskId) {
        map.remove(taskId);
    }

    private PartitionTaskContainer() {
    }

    public PartitionTask poll() {
        return queue.poll();
    }

    public void offer(List list) {
        list.forEach(t -> {
            queue.offer(t);
        });
    }

    public void offer(PartitionTask task) {
        queue.offer(task);
    }

    public int size() {
        return queue.size();
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    private static class UpdateOwnership implements Runnable {
        @Override
        public void run() {

            Set keySet = new HashSet(map.keySet());
            keySet.forEach(key -> {
                PartitionTaskContainer container = map.get(key);
                if (container.size() > 0) {
                    logger.info("当前有{}个任务片尚未分配", container.size());
                }
                for (Iterator iterator = container.queue.iterator(); iterator.hasNext(); ) {
                    // 刷新节点更新时间,表明当前server仍然掌握着该range
                    PartitionTask pt = iterator.next();
                    RangeStorage.refreshRangeLastUpdateTime(pt.getTaskId(), pt.getTableName(), pt.getRangeName());
                    logger.debug("刷新range[taskId={},tableName={},rangeName={}]的更新时间", pt.getTaskId(), pt.getTableName(), pt.getRangeName());
                }
            });
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy