private ResultPage<TaskProgress> doFind(final FindTaskProgressCriteria findTaskProgressCriteria) {
        LOGGER.debug("getTaskProgressMap() - {}", findTaskProgressCriteria);
        // This can change a little between servers.
        final long timeNowMs = System.currentTimeMillis();

        final Predicate<TaskProgress> fuzzyMatchPredicate;
        final String nameFilter = NullSafe.get(findTaskProgressCriteria, FindTaskProgressCriteria::getNameFilter);
        if (!NullSafe.isBlankString(nameFilter)) {
            LOGGER.debug("Using nameFilter: '{}'", nameFilter);
            fuzzyMatchPredicate = expressionPredicateFactory.create(
                    nameFilter,
                    FIELD_PROVIDER,
                    VALUE_FUNCTION_FACTORIES,
                    DateTimeSettings.builder().build());
        } else {
            LOGGER.debug("No nameFilter, match all");
            fuzzyMatchPredicate = taskProgress -> true;
        }

        final String criteriaSessionId = NullSafe.get(findTaskProgressCriteria,
                FindTaskProgressCriteria::getSessionId);
        // Only add this task progress if it matches the supplied criteria.
        final Predicate<TaskContextImpl> sessionIdPredicate;
        if (criteriaSessionId == null) {
            LOGGER.debug("No criteriaSessionId, match all");
            sessionIdPredicate = taskContext -> true;
        } else {
            LOGGER.debug("Match on criteriaSessionId: {}", criteriaSessionId);
            sessionIdPredicate = taskContext ->
                    Objects.equals(criteriaSessionId, taskContext.getSessionId());
        }

        // TODO @AT We can't sort server side as the UI is collating results from multiple nodes
        //  this means we would need to return the MatchInfo back to the client for it to use in its
        //  sort
        final List<TaskProgress> taskProgressList = taskRegistry.list()
                .stream()
                .filter(sessionIdPredicate)
                .map(taskContext ->
                        buildFilteredTaskProgress(timeNowMs, taskContext, fuzzyMatchPredicate))
                .toList();

        // For DEV testing uncomment this line to send dummy data to UI so you have some thing to
        // look at in the UI.
//        taskProgressList.addAll(buildDummyTaskDataForTesting(fuzzyMatchPredicate));
//        if (LOGGER.isDebugEnabled()) {
//            LOGGER.debug("taskProgressList:\n" + AsciiTable.from(taskProgressList));
//        }

        return ResultPage.createUnboundedList(taskProgressList);
    }
Tells tasks to terminate and waits for all tasks to terminate before
cleaning up the executors.
stroom-task/stroom-task-impl/src/main/java/stroom/task/impl/TaskManagerImpl.java