void exec(final Instant now) {
        clusterLockService.tryLock(LOCK_NAME, () -> {
            final LogExecutionTime logExecutionTime = new LogExecutionTime();
            try {
                info(() -> "Starting data retention process");
                // MUST truncate down to millis as the DB stores in millis and TimePeriod
                // also truncates to millis so we need to work to a consistent precision else
                // some of the date logic fails due to micro second differences
                process(now.truncatedTo(ChronoUnit.MILLIS));
                info(() -> "Finished data retention process in " + logExecutionTime);
            } catch (final TaskTerminatedException e) {
                LOGGER.debug("Task terminated", e);
                LOGGER.error(JOB_NAME + " - Task terminated after " + logExecutionTime);
            } catch (final RuntimeException e) {
                LOGGER.error(JOB_NAME + " - Error enforcing data retention policies: {}", e.getMessage(), e);
            }
        });
    }
Pkg private so we can test with a known now time
stroom-data/stroom-data-retention-impl/src/main/java/stroom/data/retention/impl/DataRetentionPolicyExecutor.java