FeedReaderScheduler.java

package net.sasasin.sreader.scheduler;

import java.util.concurrent.atomic.AtomicBoolean;
import net.sasasin.sreader.config.FeedReaderProperties;
import net.sasasin.sreader.service.FeedReaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FeedReaderScheduler {

  private static final Logger logger = LoggerFactory.getLogger(FeedReaderScheduler.class);

  private final FeedReaderProperties properties;
  private final FeedReaderService feedReaderService;
  private final AtomicBoolean running = new AtomicBoolean(false);

  public FeedReaderScheduler(FeedReaderProperties properties, FeedReaderService feedReaderService) {
    this.properties = properties;
    this.feedReaderService = feedReaderService;
  }

  @Scheduled(cron = "${sreader.scheduler.cron}")
  public void runScheduled() {
    if (!properties.scheduler().enabled()) {
      return;
    }
    runIfIdle();
  }

  public boolean runIfIdle() {
    if (!running.compareAndSet(false, true)) {
      logger.info("Feed reader job is already running; skip this trigger");
      return false;
    }
    try {
      feedReaderService.runOnce();
      return true;
    } finally {
      running.set(false);
    }
  }
}