public synchronized void inactivityTimeout ( ) { final boolean traceOn = TraceComponent . isAnyTracingEnabled ( ) ; if ( traceOn && tc . isEntryEnabled ( ) ) Tr . entry ( tc , "inactivityTimeout" , this ) ; _inactivityTimerActive = false ; if ( _inactivityTimer != null ) { try { // important that this runs as part of synchronized block // to prevent context being re-imported while processing. _inactivityTimer . alarm ( ) ; } catch ( Throwable exc ) { FFDCFilter . processException ( exc , "com.ibm.ws.tx.jta.TransactionImpl.inactivityTimeout" , "2796" , this ) ; if ( traceOn && tc . isEventEnabled ( ) ) Tr . event ( tc , "exception caught in inactivityTimeout" , exc ) ; // swallow } finally { _inactivityTimer = null ; } } else { if ( _activeAssociations <= 0 ) // off server ... do the rollback { final EmbeddableTranManagerSet tranManager = ( EmbeddableTranManagerSet ) TransactionManagerFactory . getTransactionManager ( ) ; try { // resume this onto the current thread and roll it back tranManager . resume ( this ) ; // PK15024 // If there is a superior server involved in this transaction, make sure it is told about this inactivity timeout. try { tranManager . setRollbackOnly ( ) ; } catch ( Exception e ) { FFDCFilter . processException ( e , "com.ibm.ws.Transaction.JTA.TransactionImpl.inactivityTimeout" , "4353" , this ) ; if ( traceOn && tc . isDebugEnabled ( ) ) Tr . debug ( tc , "inactivityTimeout setRollbackOnly threw exception" , e ) ; } // Mark it so that a bean on the superior server can test its status on return. // PK15024 tranManager . rollback ( ) ; } catch ( Exception ex ) { if ( traceOn && tc . isDebugEnabled ( ) ) Tr . debug ( tc , "inactivityTimeout resume/rollback threw exception" , ex ) ; // swallow this exception // main timeout may have already rolled back! } } } if ( traceOn && tc . isEntryEnabled ( ) ) Tr . exit ( tc , "inactivityTimeout" ) ; }
Called by the timeout manager when inactivity timer expires . Needs to be synchronized as it may interfere with normal timeout .