docs: @Override
      public void ready(VirtualConnection inVC) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "ready, vc=" + getVCHash());
          }
          // Double check for error condition where close already happened. Protective measure.
          if (!closed && FrameworkState.isValid()) {
              try {
                  // Outbound connections took care of sslContext and sslEngine creation already.
                  // If inbound, discrimination may have already created the engine and context
                  if (isInbound) {
                      // See if discrimination ran already. Get the state map from the VC.
                      Map<Object, Object> stateMap = inVC.getStateMap();
                      // Extract and remove result of discrimination, if it happened.
                      discState = (SSLDiscriminatorState) stateMap.remove(SSLChannel.SSL_DISCRIMINATOR_STATE);
                      if (discState != null) {
                          // Discrimination has happened. Save already existing sslEngine.
                          sslEngine = discState.getEngine();
                          sslContext = discState.getSSLContext();
                          setLinkConfig((SSLLinkConfig) stateMap.get(SSLConnectionLink.LINKCONFIG));
                      } else if (sslContext == null || getSSLEngine() == null) {
                          // Create a new SSL context based on the current properties in the ssl config.
                          sslContext = getChannel().getSSLContextForInboundLink(this, inVC);
                          // Discrimination has not happened yet. Create new SSL engine.
                          sslEngine = SSLUtils.getSSLEngine(sslContext,
                                                            sslChannel.getConfig().getFlowType(),
                                                            getLinkConfig(),
                                                            this);
                      }
                  } else {
                      // Outbound connect is ready. Ensure we have an sslContext and sslEngine.
                      if (sslContext == null || getSSLEngine() == null) {
                          // Create a new SSL context based on the current properties in the ssl config.
                          sslContext = getChannel().getSSLContextForOutboundLink(this, inVC, targetAddress);
                          // PK46069 - use engine that allows session id re-use
                          sslEngine = SSLUtils.getOutboundSSLEngine(
                                                                    sslContext, getLinkConfig(),
                                                                    targetAddress.getRemoteAddress().getHostName(),
                                                                    targetAddress.getRemoteAddress().getPort(),
                                                                    this);
                      }
                  }
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "SSL engine hc=" + getSSLEngine().hashCode() + " associated with vc=" + getVCHash());
                  }
  
                  // Flag that connection has been established.
                  // Need to set this to true for inbound and outbound so close will work right.
                  connected = true;
                  // Determine if this is an inbound or outbound connection.
                  if (isInbound) {
                      readyInbound(inVC);
                  } else {
                      readyOutbound(inVC, true);
                  }
              } catch (Exception e) {
                  if (FrameworkState.isStopping()) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Ignoring exception during server shutdown: " + e);
                      }
                  } else {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Caught exception during ready, " + e, e);
                      }
                      FFDCFilter.processException(e, getClass().getName(), "238", this);
                  }
                  close(inVC, e);
              }
          } else {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "ready called after close so do nothing");
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "ready");
          }
      }