package com.netsdk.common;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;

public class EventTaskCommonQueue {

    // 设置一个队列,容量看情况改
    private final int MAX_TASK_COUNT = 10000;   // 队列容量
    private final LinkedBlockingDeque<EventTaskHandler> eventTasks = new LinkedBlockingDeque<EventTaskHandler>(MAX_TASK_COUNT);

    // 起一个线程池
    private final int MAX_THREAD_COUNT = 10;    // 线程池容量
    private ExecutorService eventQueueService = Executors.newFixedThreadPool(MAX_THREAD_COUNT);

    // 用于检验服务运行状态
    private volatile boolean running = true;

    // 用于查看当前线程状态
    private Future<?> eventQueueThreadStatus;

    // 初始化
    public void init() {
        eventQueueThreadStatus = eventQueueService.submit(new Thread(new Runnable() {
            @Override
            public void run() {
                while (running) {
                    try {
                        EventTaskHandler task = eventTasks.take();      //开始一个任务
                        try {
                            task.eventTaskProcess();    // 主要的运行函数
                        } catch (Exception e) {
                            System.err.println("任务处理发生错误");   // error
                        }
                    } catch (InterruptedException e) {
                        System.err.println("任务已意外停止");   // error
                        running = false;
                    }
                }
            }
        }, "Event call back thread init"));
    }

    // 向队列添加新的任务
    public boolean addEvent(EventTaskHandler eventHandler) {
        if (!running) {
            System.out.println("任务已停止");   // warning
            return false;
        }
        boolean success = eventTasks.offer(eventHandler);
        if (!success) {
            // 队列已满,无法再添加
            System.out.println("添加到事件队列失败");
        }
        return success;
    }


    // 手动启动服务
    public void activeService() {
        running = true;
        if (eventQueueService.isShutdown()) {
            eventQueueService = Executors.newFixedThreadPool(MAX_THREAD_COUNT);;
            init();
            System.out.println("线程池已关闭,重新初始化线程池及任务");
        }
        if (eventQueueThreadStatus.isDone()) {
            init();
            System.out.println("线程池任务结束,重新初始化任务");
        }
    }

    // 手动关闭服务
    public void destroy() {
        running = false;
        eventQueueService.shutdownNow();
    }
}