Backfill.java

package jasper.component.cron;

import jasper.aop.IdleAspect;
import jasper.component.ConfigCache;
import jasper.component.Meta;
import jasper.config.Props;
import jasper.repository.RefRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Profile("!no-backfill")
@Component
public class Backfill {
	private static final Logger logger = LoggerFactory.getLogger(Backfill.class);

	@Autowired
	Props props;

	@Autowired
	ConfigCache configs;

	@Autowired
	IdleAspect idle;

	@Autowired
	RefRepository refRepository;

	@Autowired
	Meta meta;

	@Scheduled(fixedRate = 60, initialDelay = 10, timeUnit = TimeUnit.SECONDS)
	public void backfill() {
		if (!idle.isIdle()) return;
		if (!configs.root().script("+plugin/backfill")) return;
		for (var origin : configs.root().scriptOrigins("+plugin/backfill")) {
			backfillOrigin(origin);
		}
	}

	private void backfillOrigin(String origin) {
		if (!configs.root().script("+plugin/backfill", origin)) return;
		for (var i = 0; i < props.getBackfillBatchSize(); i++) {
			if (!idle.isIdle()) return;
			var ref = refRepository.getRefBackfill(origin).orElse(null);
			if (ref == null) return;
			logger.trace("{} Backfilling ref ({}) {}: {}",
				origin, ref.getOrigin(), ref.getTitle(), ref.getUrl());
			meta.regen(origin, ref);
			try {
				refRepository.save(ref);
			} catch (Exception e) {
				logger.error("{} Error backfilling: {}", origin, ref.getUrl(), e);
				return;
			}
		}
	}
}