public void run ( ) { final MobicentsSipApplicationSession sipApplicationSession = getApplicationSession ( ) ; SipContext sipContext = sipApplicationSession . getSipContext ( ) ; if ( logger . isDebugEnabled ( ) ) { logger . debug ( "running Servlet Timer " + id + " for sip application session " + sipApplicationSession ) ; } boolean batchStarted = false ; ClassLoader oldClassLoader = Thread . currentThread ( ) . getContextClassLoader ( ) ; try { sipContext . enterSipContext ( ) ; sipContext . enterSipApp ( sipApplicationSession , null , false , true ) ; batchStarted = sipContext . enterSipAppHa ( true ) ; if ( isCanceled == false ) { listener . timeout ( this ) ; } else { logger . debug ( "running Servlet Timer " + id + " for sip application session " + sipApplicationSession + " is cancelled, so we skip its timerListener's timeout() method call!" ) ; } } catch ( Throwable t ) { logger . error ( "An unexpected exception happened in the timer callback!" , t ) ; } finally { try { sipContext . exitSipContext ( oldClassLoader ) ; if ( isRepeatingTimer ) { estimateNextExecution ( ) ; } else { // this non-repeating timer is now "ready" // and should not be included in the list of active timers // The application may already have canceled() the timer though cancel ( ) ; // dont bother about return value.... } if ( logger . isDebugEnabled ( ) ) { logger . debug ( "Servlet Timer " + id + " for sip application session " + sipApplicationSession + " ended" ) ; } } finally { sipContext . exitSipAppHa ( null , null , batchStarted ) ; sipContext . exitSipApp ( sipApplicationSession , null ) ; } } }
Method that actually