docs: @Override
      public void close() throws Exception {
          if (scopeCleaner.close()) { // executor thread to exit processing loop            
              LOGGER.info("closing PreDestroyMonitor...");
              List<Map.Entry<Object, UnscopedCleanupAction>> actions = new ArrayList<>(cleanupActions.entrySet());
              if (actions.size() > 0) {
                  LOGGER.warn("invoking predestroy action for {} unscoped instances", actions.size());
                  actions.stream().map(Map.Entry::getValue).collect(
                      Collectors.groupingBy(UnscopedCleanupAction::getContext, Collectors.counting())).forEach((source, count)->{
                          LOGGER.warn("  including {} objects from source '{}'", count, source);
                      });
              }
              actions.stream().sorted(Map.Entry.comparingByValue()).forEach(action->{
                  Optional.ofNullable(action.getKey()).ifPresent(obj->action.getValue().call(obj));                    
              });             
              actions.clear();
              cleanupActions.clear();
              scopeBindings.clear();
              scopeBindings = Collections.emptyMap();
          } else {
              LOGGER.warn("PreDestroyMonitor.close() invoked but instance is not running");
          }
      }