code: public @CheckForNull CauseOfBlockage getCauseOfBlockage(BuildableItem item) {
              Node node = getNode();
              if (node == null) {
                  return CauseOfBlockage.fromMessage(Messages._Queue_node_has_been_removed_from_configuration(executor.getOwner().getDisplayName()));
              }
              CauseOfBlockage reason = node.canTake(item);
              if (reason != null) {
                  return reason;
              }
              for (QueueTaskDispatcher d : QueueTaskDispatcher.all()) {
                  reason = d.canTake(node, item);
                  if (reason != null) {
                      return reason;
                  }
              }
              // inlining isAvailable:
              if (workUnit != null) { // unlikely in practice (should not have even found this executor if so)
                  return CauseOfBlockage.fromMessage(Messages._Queue_executor_slot_already_in_use());
              }
              if (executor.getOwner().isOffline()) {
                  return new CauseOfBlockage.BecauseNodeIsOffline(node);
              }
              if (!executor.getOwner().isAcceptingTasks()) { // Node.canTake (above) does not consider RetentionStrategy.isAcceptingTasks
                  return new CauseOfBlockage.BecauseNodeIsNotAcceptingTasks(node);
              }
              return null;
          }
docs: Checks whether the {@link Executor} represented by this object is capable of executing the given task.
  @return a reason why it cannot, or null if it could
  @since 2.37