@Override
    public void memberDeparted(DistributionManager distributionManager,
        InternalDistributedMember id, boolean crashed) {
      synchronized (this) {
        if (!distributedMembers.remove(id)) {
          return;
        }
        agent.cancelPendingJoins(id);
        if (!agent.isListening()) {
          return;
        }
      }

      // remove the member...

      RemoteGemFireVM member = null;
      switch (id.getVmKind()) {
        case ClusterDistributionManager.NORMAL_DM_TYPE:
          member = agent.removeMember(id);
          break;
        case ClusterDistributionManager.ADMIN_ONLY_DM_TYPE:
          break;
        case ClusterDistributionManager.LOCATOR_DM_TYPE:
          break;
        case ClusterDistributionManager.LONER_DM_TYPE:
          break; // should this ever happen?
        default:
          throw new IllegalArgumentException("Unknown VM Kind");
      }

      // clean up and notify JoinLeaveListeners...
      if (member != null) {
        for (JoinLeaveListener listener : agent.listeners) {
          if (crashed) {
            listener.nodeCrashed(agent, member);
          } else {
            listener.nodeLeft(agent, member);
          }
        }
        member.stopStatListening();
      }
    }
This method is invoked after a member has explicitly left the system. It may not get invoked
if a member becomes unreachable due to crash or network problems.

@see JoinLeaveListener#nodeCrashed
@see JoinLeaveListener#nodeLeft
geode-core/src/main/java/org/apache/geode/internal/admin/remote/RemoteGfManagerAgent.java