code: @Override
      public synchronized void destroyChain(ChainData chaindata) throws ChannelException, ChainException {
          String chainName = (null != chaindata) ? chaindata.getName() : null;
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "destroyChain: " + chainName);
          }
  
          if (null == chaindata) {
              throw new InvalidChainNameException("Null chain");
          }
          // Ensure we have an inbound chain.
          if (FlowType.OUTBOUND.equals(chaindata.getType())) {
              throw new InvalidChainNameException("Outbound chain cannot use this interface.");
          }
  
          // Verify the chain is in the runtime.
          Chain chain = getRunningChain(chainName);
          if (null == chain) {
              // Due to timing windows (i.e. multiple channel providers going away), there is
              // a race to destroy chains. This is not a notable condition: the chain can only be destroyed
              // once.
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "destroyChain: " + chainName + " does not exist -- may already have been destroyed");
              }
              return;
          }
  
          destroyChainInternal(chain);
      }
docs: /*
  @see
  com.ibm.wsspi.channelfw.ChannelFramework#destroyChain(com.ibm.websphere
  .channelfw.ChainData)