Author: cwiklik Date: Mon Feb 14 15:18:08 2011 New Revision: 1070516 URL: http://svn.apache.org/viewvc?rev=1070516&view=rev Log: UIMA-2038 Modified destroy() to always call listener.shutdown() method. Removed code that explicitly waited for all threads to finish. This is no longed needed as all threads are daemon threads.
Modified: uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/UimaDefaultMessageListenerContainer.java Modified: uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/UimaDefaultMessageListenerContainer.java URL: http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/UimaDefaultMessageListenerContainer.java?rev=1070516&r1=1070515&r2=1070516&view=diff ============================================================================== --- uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/UimaDefaultMessageListenerContainer.java (original) +++ uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/UimaDefaultMessageListenerContainer.java Mon Feb 14 15:18:08 2011 @@ -675,7 +675,9 @@ public class UimaDefaultMessageListenerC // Initialize the TaskExecutor. This call injects a custom Thread Pool into the // TaskExecutor provided in the spring xml. The custom thread pool initializes // an instance of AE in a dedicated thread - initializeTaskExecutor(); + if ( getMessageSelector() != null && !isGetMetaListener()) { + initializeTaskExecutor(); + } if ( threadPoolExecutor == null ) { // Plug in TaskExecutor to Spring's Listener __listenerRef.injectTaskExecutor(); @@ -925,12 +927,13 @@ public class UimaDefaultMessageListenerC "threadGroupDestroyer") { public void run() { try { - if ( !__listenerRef.awaitingShutdown && __listenerRef.isRunning() ) { + if ( !__listenerRef.awaitingShutdown ) { awaitingShutdown = true; // delegate stop request to Spring __listenerRef.delegateStop(); if (taskExecutor != null && taskExecutor instanceof ThreadPoolTaskExecutor) { - ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().shutdownNow(); + ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().purge(); + ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().shutdown(); ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } else if (concurrentListener != null) { shutdownTaskExecutor(concurrentListener.getTaskExecutor()); @@ -938,8 +941,8 @@ public class UimaDefaultMessageListenerC } else if ( threadPoolExecutor != null ) { shutdownTaskExecutor(threadPoolExecutor); } - __listenerRef.shutdown(); } + __listenerRef.shutdown(); } catch (Exception e) { UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, this.getClass().getName(), "destroy", JmsConstants.JMS_LOG_RESOURCE_BUNDLE, @@ -949,36 +952,6 @@ public class UimaDefaultMessageListenerC if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.FINEST)) { threadGroup.getParent().list(); } - // Wait until all threads are accounted for - while (threadGroup.activeCount() > 0) { - try { - Thread[] threads = new Thread[threadGroup.activeCount()]; - threadGroup.enumerate(threads); - boolean foundExpectedThreads = true; - - for (Thread t : threads) { - try { - if ( !isAmqThread(t) ) { - foundExpectedThreads = false; - break; // from for - } - // Check if there are still any non-daemon threads left in the thread group - if ( !t.isDaemon() ) { - foundExpectedThreads = false; - break; // from for - - } - } catch (Exception e) { - } - } - if (foundExpectedThreads) { - break; // from while - } - Thread.sleep(100); - } catch (InterruptedException e) { - } - } - try { synchronized (threadGroup) { if (!threadGroup.isDestroyed()) { @@ -994,18 +967,6 @@ public class UimaDefaultMessageListenerC } - private boolean isAmqThread(Thread t) { - String tName = t.getName(); - // The following is necessary to account for the AMQ threads - // Any threads not named in the list below will cause a wait - // and retry until all non-amq threads are stopped - if (!tName.startsWith("main") && !tName.equalsIgnoreCase("timer-0") - && !tName.equals("ReaderThread") && !tName.equals("BrokerThreadGroup") - && !tName.startsWith("ActiveMQ")) { - return false; - } - return true; - } private void setUimaASThreadPoolExecutor(int consumentCount) throws Exception{ super.setMessageListener(ml); // create task executor with custom thread pool for: