public void handleResponse(StunMessageEvent evt){
  lock.lock();
  try {
    TransactionID transactionID=getTransactionID();
    logger.log(Level.FINE,"handleResponse tid " + transactionID);
    if (!Boolean.getBoolean(StackProperties.KEEP_CRANS_AFTER_A_RESPONSE))     cancel();
    responseCollector.processResponse(new StunResponseEvent(stackCallback,evt.getRawMessage(),(Response)evt.getMessage(),request,transactionID));
  }
  finally {
    lock.unlock();
  }
}

public void handleResponse ( StunMessageEvent evt ) { lock . lock ( ) ; try { TransactionID transactionID = getTransactionID ( ) ; logger . log ( Level . FINE , "handleResponse tid " + transactionID ) ; if ( ! Boolean . getBoolean ( StackProperties . KEEP_CRANS_AFTER_A_RESPONSE ) ) cancel ( ) ; responseCollector . processResponse ( new StunResponseEvent ( stackCallback , evt . getRawMessage ( ) , ( Response ) evt . getMessage ( ) , request , transactionID ) ) ; } finally { lock . unlock ( ) ; } }
dispatches the response then cancels itself and notifies the stunstack for its termination .
