code: @Override
      public synchronized void stopChain(String chainName, long millisec) throws ChannelException, ChainException {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "stopChain: " + chainName + " time=" + millisec);
          }
          if (null == chainName) {
              throw new InvalidChainNameException("Null chain name");
          }
          if (millisec < 0) {
              throw new ChainTimerException("Invalid time length give to stopChain, " + millisec);
          }
  
          // Verify the chain is found 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 stop chains. This is not a notable condition: the chain can only be stopped
              // once.
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
                  Tr.exit(tc, "stopChain " + chainName, "chain is not running");
              }
              return;
          }
  
          // Ensure we have an inbound chain.
          if (FlowType.OUTBOUND.equals(chain.getChainData().getType())) {
              throw new InvalidChainNameException("Outbound chain cannot use this interface.");
          }
  
          stopChainInternal(chain, millisec);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "stopChain");
          }
      }
docs: /*
  @see com.ibm.wsspi.channelfw.ChannelFramework#stopChain(String, long)