code: public void invokeNodeAction (final NodeAction action, final Runnable onDropped)
      {
          // if we're not on the dobjmgr thread, get there
          if (!_omgr.isDispatchThread()) {
              _omgr.postRunnable(new Runnable() {
                  public void run () {
                      invokeNodeAction(action, onDropped);
                  }
              });
              return;
          }
  
          // first serialize the action to make sure we can
          byte[] actionBytes = flattenAction(action);
  
          // invoke the action on our local server if appropriate
          boolean invoked = false;
          if (action.isApplicable(_nodeobj)) {
              invokeAction(null, actionBytes);
              invoked = true;
          }
  
          // now send it to any remote node that is also appropriate
          for (PeerNode peer : _peers.values()) {
              if (peer.nodeobj != null && action.isApplicable(peer.nodeobj)) {
                  peer.nodeobj.peerService.invokeAction(actionBytes);
                  invoked = true;
              }
          }
  
          // if we did not invoke the action on any node, call the onDropped handler
          if (!invoked && onDropped != null) {
              onDropped.run();
          }
  
          if (invoked) {
              _stats.noteNodeActionInvoked(action); // stats!
          }
      }
docs: Invokes the supplied action on this and any other server that it indicates is appropriate.
  The action will be executed on the distributed object thread, but this method does not need
  to be called from the distributed object thread.
  
  @param onDropped a runnable to be executed if the action was not invoked on the local server
  or any peer node due to failing to match any of the nodes. The runnable will be executed on
  the dobj event thread.