package com.snowcattle.game.service.rpc.server; import com.snowcattle.game.thread.policy.*; import com.snowcattle.game.common.ThreadNameFactory; import com.snowcattle.game.common.annotation.BlockingQueueType; import com.snowcattle.game.common.constant.GlobalConstants; import com.snowcattle.game.common.constant.Loggers; import org.slf4j.Logger; import org.springframework.stereotype.Service; import java.util.concurrent.*; /** * Created by jwp on 2017/3/8. */ @Service public class RpcHandlerThreadPool { private final Logger logger = Loggers.threadLogger; private ExecutorService executor; private RejectedExecutionHandler createPolicy() { RejectedPolicyType rejectedPolicyType = RejectedPolicyType.fromString(System.getProperty(RpcSystemConfig.SystemPropertyThreadPoolRejectedPolicyAttr, "CallerRunsPolicy")); switch (rejectedPolicyType) { case BLOCKING_POLICY: return new BlockingPolicy(); case CALLER_RUNS_POLICY: return new CallerRunsPolicy(); case ABORT_POLICY: return new AbortPolicy(); case REJECTED_POLICY: return new RejectedPolicy(); case DISCARDED_POLICY: return new DiscardedPolicy(); } return null; } private BlockingQueue<Runnable> createBlockingQueue(int queues) { BlockingQueueType queueType = BlockingQueueType.fromString(System.getProperty(RpcSystemConfig.SystemPropertyThreadPoolQueueNameAttr, "LinkedBlockingQueue")); switch (queueType) { case LINKED_BLOCKING_QUEUE: return new LinkedBlockingQueue<Runnable>(); case ARRAY_BLOCKING_QUEUE: return new ArrayBlockingQueue<Runnable>(RpcSystemConfig.PARALLEL * queues); case SYNCHRONOUS_QUEUE: return new SynchronousQueue<Runnable>(); } return null; } public Executor createExecutor(int threads, int queues) { String name = GlobalConstants.Thread.RPC_HANDLER; ThreadPoolExecutor executor = new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, createBlockingQueue(queues), new ThreadNameFactory(name, false), createPolicy()); this.executor = executor; return executor; } public ExecutorService getExecutor() { return executor; } public void setExecutor(ExecutorService executor) { this.executor = executor; } }