/******************************************************************************* * Copyright © 2012-2015 eBay Software Foundation * This program is dual licensed under the MIT and Apache 2.0 licenses. * Please see LICENSE for more information. *******************************************************************************/ package com.ebay.jetstream.scattergather; /** * TaskExecutor is a space where scatter gather tasks are executed. * It holds a FifoQueue and a pool of threads. * * @author shmurthy@ebay.com * */ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import com.ebay.jetstream.management.Management; import com.ebay.jetstream.util.FifoPriorityQueue; import com.ebay.jetstream.util.RequestThreadMonitor; import com.ebay.jetstream.util.RequestThreadPool; import com.ebay.jetstream.xmlser.XSerializable; public class TaskExecutor implements XSerializable, InitializingBean { private RequestThreadPool m_taskExecutorThreadPool; private FifoPriorityQueue m_taskQueue; private int m_threadPoolSize = 60; private int m_queueSize = m_threadPoolSize + 1; Logger logger = LoggerFactory.getLogger("com.ebay.jetstream.scattergather.TaskExecutor"); public TaskExecutor() { Management.addBean("TaskMaster/TaskExecutor", this); } public void init() { if (m_taskQueue == null) { m_taskQueue = new FifoPriorityQueue(); m_taskQueue.setMaxSize(m_threadPoolSize + 1); } if (m_taskExecutorThreadPool == null) { m_taskExecutorThreadPool = new RequestThreadPool(); m_taskExecutorThreadPool.setMonitor(new RequestThreadMonitor()); m_taskExecutorThreadPool.init(m_taskQueue, m_threadPoolSize); try { m_taskExecutorThreadPool.start(); } catch (Exception e) { logger.error( "EXCEPTION when starting RequestThreadpool from TaskExecutor " + e.getLocalizedMessage(), e); } } } /** * @param ter * @throws Exception */ public void execute(TaskExecutorRequest ter) throws Exception { m_taskQueue.insertAtTail(ter); } public int getCurrentQueueSize() { return m_taskQueue.size(0); } /** * @return the queueSize */ public int getQueueSize() { return m_queueSize; } /** * @return */ public int getThreadPoolSize() { return m_threadPoolSize; } /** * @param queueSize * the queueSize to set */ public void setQueueSize(int queueSize) { m_queueSize = queueSize; } /** * @param threadPoolSize */ public void setThreadPoolSize(int threadPoolSize) { m_threadPoolSize = threadPoolSize; m_queueSize = m_threadPoolSize + 1 ; } public long getActiveThreadCount(){ if(m_taskExecutorThreadPool.getMonitor() != null) return m_taskExecutorThreadPool.getMonitor().getActiveThreadCount(); // no monitor is set to give the active thread count. So returning 0 will not be correct. Returning -1. return -1; } public void afterPropertiesSet() throws Exception { init(); } }