code: @Override
      public void error(VirtualConnection vc, Throwable t) { 
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "Calling user's ReadListener onError : " + this.in.getReadListener());
          }
          Exception e = null;
          
          SRTServletRequestThreadData.getInstance().init(_requestDataAsyncReadCallbackThread);
          
          //Push the original thread's context onto the current thread, also save off the current thread's context
          this.threadContextManager.pushContextData();
          
          if(this.in.getReadListener() != null){
              synchronized( this.in.getCompleteLockObj()){
                  try {
                      //An error occurred. Issue the onError call on the user's ReadListener
                      this.in.getReadListener().onError(t);
                  } catch (Exception onErrorException) {
                      e = onErrorException;
                  }
              }
  
              if (e != null && TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Exception occurred during ReadListener.onError : " + e + ", " + this.in.getReadListener());
              }
              else{
                  if (t != null && TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Exception occurred during ReadListener and error cannot handle : " + t.getMessage() + ", " + this.in.getReadListener());
                  }
              }
          }
          
          //Revert back to the thread's current context
          this.threadContextManager.popContextData();
  
      }
docs: /* (non-Javadoc)
  @see com.ibm.wsspi.channelfw.InterChannelCallback#error(com.ibm.wsspi.channelfw.VirtualConnection, java.lang.Throwable)