code: public void destroy() throws ChainException, ChannelException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "destroy; " + this);
          }
          synchronized (this.cf) {
              // Verify that the VCF hasn't already been destroyed.
              if (0 == getRefCount()) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Virtual connection factory already destroyed");
                  }
                  throw new ChainException("Virtual connection factory already destroyed");
              }
              decrementRefCount();
              // Check if there are no more users of the chain.
              if (0 == getRefCount()) {
                  // Verify the chain was ever used beyond init. That is a call was
                  // made to get a VCF, but never a VC. Note, outbound chains can
                  // never be in QUIESCED state.
                  if (getChain().getState() == RuntimeState.STARTED) {
                      this.cf.stopChainInternal(getChain(), 0);
                  }
                  this.cf.destroyChainInternal(getChain());
              }
          } // end sync block
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "destroy");
          }
      }
docs: /*
  @see com.ibm.wsspi.channelfw.VirtualConnectionFactory#destroy()