package com.aol.micro.server.async.data.cleaner; import java.util.List; import java.util.concurrent.Executors; import java.util.function.BinaryOperator; import cyclops.collections.ListX; import cyclops.control.Maybe; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.aol.micro.server.manifest.ManifestComparator; import com.google.common.eventbus.EventBus; @Configuration public class ConfigureSchedulingAsyncDataWriter { @Value("${async.data.schedular.cron.cleaner:0 0 * * * ?}") private String defaultCronCleaner; @Value("${async.data.schedular.threads:1}") private int schedularThreads; @Autowired(required = false) private List<DataCleaner> dataCleaners = ListX.empty(); @Autowired(required = false) private List<ConditionallyClean> predicates = ListX.empty(); @Autowired private EventBus bus; @Autowired(required = false) private List<ManifestComparator> defaultComparators; private ListX<DataCleaner> dataCleaners() { Maybe<DataCleaner> defaultDataCleaner = defaultComparators.size() == 1 ? Maybe.just(new DataCleaner( defaultComparators.get(0), defaultCronCleaner)) : Maybe.none(); return ListX.fromIterable(defaultDataCleaner) .plusAll(dataCleaners); } @Bean public CleanerSchedular asyncDataCleaner() { ConditionallyClean cc = () -> true; BinaryOperator<ConditionallyClean> accumulator = (cc1, cc2) -> () -> cc1.shouldClean() && cc2.shouldClean(); CleanerSchedular schedular = new CleanerSchedular( dataCleaners(), Executors.newScheduledThreadPool(schedularThreads), bus, predicates.stream() .reduce(cc, accumulator)); schedular.schedule(); return schedular; } }