/******************************************************************************* * 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.util; import java.util.concurrent.CountDownLatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An implementation of a request thread pattern * * * * * @author shmurthy@ebay.com * @version 1.0 */ public class RequestThread extends Thread { private FifoPriorityQueue m_queue = null; private static final Logger LOGGER = LoggerFactory.getLogger("com.ebay.jetstream.util"); private RequestThreadMonitor m_monitor; private final CountDownLatch endLatch = new CountDownLatch(1); public RequestThread() { super("RequestThread"); setUncaughtExceptionHandler(new UncaughtRequestThreadExceptionHandler()); } public RequestThread(FifoPriorityQueue queue) { super("RequestThread"); setUncaughtExceptionHandler(new UncaughtRequestThreadExceptionHandler()); m_queue = queue; } public RequestThread(FifoPriorityQueue queue, RequestThreadMonitor monitor) { super("RequestThread"); setMonitor(monitor); setUncaughtExceptionHandler(new UncaughtRequestThreadExceptionHandler()); m_queue = queue; } public RequestThreadMonitor getMonitor() { return m_monitor; } public void init(FifoPriorityQueue queue) { m_queue = queue; start(); } @Override public void run() { try { while (true) { try { Request req = (Request) m_queue.removeHead(); if (req == null) continue; if (req instanceof AbortRequest) return; // abort thread if (m_monitor != null) m_monitor.requestSubmitted(); req.execute(); req = null; } catch (Throwable t) { LOGGER.error( "Exception \'" + t.getMessage() + "\' in thread " + getName()); } finally { if (m_monitor != null) m_monitor.requestExecuted(); } } // while loop } finally { endLatch.countDown(); } } public void setMonitor(RequestThreadMonitor monitor) { m_monitor = monitor; } public void shutdown() { AbortRequest ar = new AbortRequest(); m_queue.insertAtTail(ar); try { endLatch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // thread returns } }