this.cancel();
try { this.cancel(); } catch (IllegalStateException ex) { if ( ! this.sipStack.isAlive()) return; }
        public void run() {                        // If the transaction has terminated,            if (clientTransaction.isTerminated()) {                synchronized(sipStack.clientTransactions) {                    if (LogWriter.needsLogging) {                        sipStack.logWriter.logMessage( "removing  = " + clientTransaction + " isReliable " +                	 clientTransaction.isReliable() );		    }                    sipStack.clientTransactions.remove(clientTransaction);		                    }		this.cancel();                                // Client transaction terminated. Kill connection if                // this is a TCP after the linger timer has expired.		// The linger timer is needed to allow any pending requests to return responses.                if (  ( ! this.sipStack.cacheClientConnections )                	&& clientTransaction.isReliable()                	&& -- ((TCPMessageChannel) clientTransaction.encapsulatedChannel).useCount == 0 ) {		    	// Let the connection linger for a while and then close it.		    	this.clientTransaction.myTimer = new LingerTimer(this.clientTransaction);		    	sipStack.timer.schedule(myTimer,SIPTransactionStack.CONNECTION_LINGER_TIME*1000);		} else {		    // Cache the client connections so dont close the connection.                    if (LogWriter.needsLogging                    	&& clientTransaction.isReliable())                        sipStack.logWriter.logMessage( "Client Use Count = " +                        ((TCPMessageChannel) clientTransaction.encapsulatedChannel).useCount);                }                                                // If this transaction has not                // terminated,            } else {		// Fire the transaction timer.                clientTransaction.fireTimer();                            }                    }