Author: cwiklik
Date: Wed Jan 25 20:06:08 2012
New Revision: 1235895

URL: http://svn.apache.org/viewvc?rev=1235895&view=rev
Log:
UIMA-2358 Added global DefaultUncaughtExceptionHandler to catch java Errors 
uncaught anywhere else. Added System.exit(2) in JmsInputChannel and 
PrimitiveAnalysisEngineController_impl when OOM happens

Added:
    
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java
   (with props)
Modified:
    
uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/JmsInputChannel.java
    
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/BaseAnalysisEngineController.java
    
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/PrimitiveAnalysisEngineController_impl.java
    
uima/uima-as/trunk/uimaj-as-core/src/main/resources/uimaee_messages.properties

Modified: 
uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/JmsInputChannel.java
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/JmsInputChannel.java?rev=1235895&r1=1235894&r2=1235895&view=diff
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/JmsInputChannel.java
 (original)
+++ 
uima/uima-as/trunk/uimaj-as-activemq/src/main/java/org/apache/uima/adapter/jms/activemq/JmsInputChannel.java
 Wed Jan 25 20:06:08 2012
@@ -709,6 +709,13 @@ public class JmsInputChannel implements 
       }
 
     } catch (Throwable t) {
+      if ( t instanceof Error) {
+        t.printStackTrace();
+        System.err.println("\n\n\n\tUIMA AS Service Caught Java Error. Exiting 
via System.exit(2)");
+        System.err.flush();
+
+        System.exit(2);
+      }
       if (UIMAFramework.getLogger(CLASS_NAME).isLoggable(Level.WARNING)) {
         
         UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, 
CLASS_NAME.getName(),

Modified: 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/BaseAnalysisEngineController.java
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/BaseAnalysisEngineController.java?rev=1235895&r1=1235894&r2=1235895&view=diff
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/BaseAnalysisEngineController.java
 (original)
+++ 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/BaseAnalysisEngineController.java
 Wed Jan 25 20:06:08 2012
@@ -70,6 +70,7 @@ import org.apache.uima.aae.error.ErrorHa
 import org.apache.uima.aae.error.ForcedMessageTimeoutException;
 import org.apache.uima.aae.error.MessageTimeoutException;
 import org.apache.uima.aae.error.ServiceShutdownException;
+import org.apache.uima.aae.error.UimaAsUncaughtExceptionHandler;
 import org.apache.uima.aae.error.handler.ProcessCasErrorHandler;
 import org.apache.uima.aae.jmx.JmxManagement;
 import org.apache.uima.aae.jmx.JmxManager;
@@ -294,7 +295,6 @@ public abstract class BaseAnalysisEngine
     aeDescriptor = aDescriptor;
     parentController = aParentController;
     componentCasPoolSize = aComponentCasPoolSize;
-
     if (this instanceof AggregateAnalysisEngineController) {
       // Populate a list of un-registered co-located delegates. A delegate 
will be taken off the
       // un-registered list
@@ -334,6 +334,11 @@ public abstract class BaseAnalysisEngine
     resourceSpecifier = UimaClassFactory.produceResourceSpecifier(aDescriptor);
 
     if (isTopLevelComponent()) {
+      // 
******************************************************************************
+      //  Set a global UncaughtExceptionHandler to handle OOM and other 
uncaught Throwables
+      // 
******************************************************************************
+      //  this adds the handler to every thread
+      Thread.setDefaultUncaughtExceptionHandler(new 
UimaAsUncaughtExceptionHandler(getComponentName()));
       // Check the version of uimaj that UIMA AS was built with, against the 
UIMA Core version. If not the same throw Exception
       if 
(!UimaAsVersion.getUimajFullVersionString().equals(UimaVersion.getFullVersionString()))
 {
         UIMAFramework.getLogger(CLASS_NAME).logrb(

Modified: 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/PrimitiveAnalysisEngineController_impl.java
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/PrimitiveAnalysisEngineController_impl.java?rev=1235895&r1=1235894&r2=1235895&view=diff
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/PrimitiveAnalysisEngineController_impl.java
 (original)
+++ 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/controller/PrimitiveAnalysisEngineController_impl.java
 Wed Jan 25 20:06:08 2012
@@ -880,6 +880,13 @@ public class PrimitiveAnalysisEngineCont
         localCache.remove(aCasReferenceId);
       }
     } catch (Throwable e) {
+      
+      if ( e instanceof OutOfMemoryError ) {
+        e.printStackTrace();
+        System.err.println("\n\n\n\t!!!!! UIMA AS Service Caught Java Error 
While in process() method. Exiting via System.exit(2)\n\n\n");
+        System.err.flush();
+        System.exit(2);
+      }
        if ( stackDumpTimer != null ) {
                stackDumpTimer.cancel();
        }

Added: 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java?rev=1235895&view=auto
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java
 (added)
+++ 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java
 Wed Jan 25 20:06:08 2012
@@ -0,0 +1,46 @@
+package org.apache.uima.aae.error;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.aae.UIMAEE_Constants;
+import org.apache.uima.util.Level;
+
+public class UimaAsUncaughtExceptionHandler implements 
UncaughtExceptionHandler {
+  private static final Class<UimaAsUncaughtExceptionHandler> CLASS_NAME = 
UimaAsUncaughtExceptionHandler.class;
+  private volatile boolean handledOOMalready;
+  String uimaAsService;
+  
+  public UimaAsUncaughtExceptionHandler(String uimaAsService) {
+    this.uimaAsService = uimaAsService;
+  }
+
+  private boolean isTerminalError(Throwable t) {
+    return (t instanceof OutOfMemoryError || 
+            t instanceof LinkageError ||
+            t instanceof NoClassDefFoundError ||
+            t instanceof NoSuchMethodError );
+  }
+  public void uncaughtException(Thread t, Throwable e) {
+    if ( !handledOOMalready ) {   // the OOM has already been reported 
+      if ( e instanceof OutOfMemoryError ) {
+        handledOOMalready = true;
+      }
+      //  the following are best effort attempts to show the errors. If the 
error
+      //  is OOM, dumping trace or logging may cause another OOM.
+      e.printStackTrace();
+      UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, 
CLASS_NAME.getName(),
+              "uncaughtException", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE,
+              "UIMAEE_uncaught_error_WARNING", new Object[] {uimaAsService,e});
+      if ( isTerminalError(e) ) {
+        UIMAFramework.getLogger(CLASS_NAME).logrb(Level.WARNING, 
CLASS_NAME.getName(),
+                "uncaughtException", UIMAEE_Constants.JMS_LOG_RESOURCE_BUNDLE,
+                "UIMAEE_terminal_error_WARNING",new Object[] {uimaAsService});
+        System.exit(2);
+      }
+    } else {
+      System.exit(2);  // repeated OOM, just exit
+    }
+  }
+
+}

Propchange: 
uima/uima-as/trunk/uimaj-as-core/src/main/java/org/apache/uima/aae/error/UimaAsUncaughtExceptionHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
uima/uima-as/trunk/uimaj-as-core/src/main/resources/uimaee_messages.properties
URL: 
http://svn.apache.org/viewvc/uima/uima-as/trunk/uimaj-as-core/src/main/resources/uimaee_messages.properties?rev=1235895&r1=1235894&r2=1235895&view=diff
==============================================================================
--- 
uima/uima-as/trunk/uimaj-as-core/src/main/resources/uimaee_messages.properties 
(original)
+++ 
uima/uima-as/trunk/uimaj-as-core/src/main/resources/uimaee_messages.properties 
Wed Jan 25 20:06:08 2012
@@ -251,4 +251,7 @@ UIMAEE_checking_in_ae_to_pool__INFO=Cont
 UIMAEE_checked_in_ae_to_pool__INFO=Controller: {0} Checked in AE instance to 
AePoolManager. Thread Id:{1}
 UIMAEE_calling_ae_initialize__INFO=Controller: {0} Initializing AE instance on 
Thread Id: {1}
 UIMAEE_process_thread_exiting__INFO=Controller: {0} --------------- Process 
Thread ID:{1} EXITING
-UIMAEE_ae_instance_destroy_called__INFO=Controller: {0} --------------- AE 
destroy() Method Call Returned ID:{1}
\ No newline at end of file
+UIMAEE_ae_instance_destroy_called__INFO=Controller: {0} --------------- AE 
destroy() Method Call Returned ID:{1}
+UIMAEE_uncaught_error_WARNING=Controller: {0} Handling uncaught Throwable. 
Stack trace:\n {1}
+UIMAEE_terminal_error_WARNING=Controller:{0} Exiting via System.exit(2) Due to 
unrecoverable error
+


Reply via email to