package com.aol.micro.server.async.data.loader; import java.util.List; import java.util.concurrent.Executors; import java.util.function.BinaryOperator; import cyclops.collections.ListX; import cyclops.collections.SetX; import cyclops.stream.ReactiveSeq; 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 ConfigureSchedulingAsyncDataLoader { @Value("${async.data.schedular.cron.loader:0 * * * * ?}") private String defaultCron; @Value("${async.data.schedular.threads:5}") private int schedularThreads; @Autowired(required = false) private List<DataLoader> dataLoaders = ListX.empty(); @Autowired private EventBus bus; @Autowired(required = false) private List<ManifestComparator> defaultComparators = ListX.empty(); @Autowired(required = false) private List<ConditionallyLoad> predicates = ListX.empty(); private ListX<DataLoader> dataLoaders() { SetX<ManifestComparator> comparatorSet = SetX.fromIterable(dataLoaders) .map(dl -> dl.comparator); return ReactiveSeq.fromIterable(defaultComparators) .filter(i -> !comparatorSet.contains(i)) .map(mc -> new DataLoader( mc, defaultCron)) .appendS(dataLoaders.stream()) .toListX(); } @Bean public LoaderSchedular asyncDataLoader() { ConditionallyLoad cc = () -> true; BinaryOperator<ConditionallyLoad> accumulator = (cc1, cc2) -> () -> cc1.shouldLoad() && cc2.shouldLoad(); LoaderSchedular schedular = new LoaderSchedular( dataLoaders(), Executors.newScheduledThreadPool(schedularThreads), bus, predicates.stream() .reduce(cc, accumulator)); schedular.schedule(); return schedular; } }