, так что приведенной информации не так уж и много. Я могу показать вам рабочий пример в распределенной системе, который, как я полагаю, у вас есть, поскольку вы упомянули поды, что означает, что ваш сервис находится в Kubernetes.
application.yml / application.properties
your-app-config-root:
scheduling:
shedlock:
min-time-lock-should-kept: ${SHEDLOCK_MIN_TIME_LOCK_KEPT:PT10S}
max-time-lock-should-kept: ${SHEDLOCK_MAX_TIME_LOCK_KEPT:PT30S}
alert-on-unfinished-cleanup-scheduler:
enabled: ${ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_ENABLED:false}
cron: ${ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_CRON:0 0 8,11,14 * * *} # by default every day at 8, 11, 14
minutes-since-cleanup-job-unfinished: ${MINUTES_SINCE_CLEANUP_JOB_UNFINISHED:1440} # by default 24 hours
Конфигурация для планировщика
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import javax.sql.DataSource;
import static net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock.InterceptMode.PROXY_METHOD;
/**
* The defaultLockAtMostFor is the default value how long the lock should be kept in case the service which obtained the lock
* died before releasing it.
* This is just a fallback, under normal circumstances the lock is released as soon the tasks finishes.
*/
@Configuration
@EnableScheduling
@EnableSchedulerLock(interceptMode = PROXY_METHOD,
defaultLockAtMostFor = "${your-app-config-root.scheduling.shedlock.max-time-lock-should-kept}",
defaultLockAtLeastFor = "${your-app-config-root.scheduling.shedlock.min-time-lock-should-kept}")
public class SchedulingConfiguration {
@Bean
public LockProvider lockProvider(final DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
}
Само задание Cron
import io.your-app-config-root.platform.cleanup.CleanupService;
import io.your-app-config-root.platform.cleanup.metric.MetricService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import static io.your-app-config-root.platform.cleanup.scheduler.AlertOnUnfinishedCleanupJob.ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_PROPERTIES;
/**
* This scheduled job is responsible for alerting on unfinished cleanup jobs after 24 hour.
* ShedLock included for making sure not running concurrent jobs on the same tasks at the same time.
*/
@Slf4j
@Component
@ConditionalOnProperty(value = ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_PROPERTIES + ".enabled", havingValue = "true")
@RequiredArgsConstructor
public class AlertOnUnfinishedCleanupJob {
public static final String ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_PROPERTIES = "your-app-config-root.scheduling.alert-on-unfinished-cleanup-scheduler";
private final CleanupService cleanupService;
private final MetricService metricService;
@Scheduled(cron = "${" + ALERT_ON_UNFINISHED_CLEANUP_SCHEDULER_PROPERTIES + ".cron}")
@SchedulerLock(name = "alertOnUnfinishedCleanup")
public void alertOnUnfinishedCleanup() {
log.info("Alert on unfinished cleanup job has started.");
// DO THINGS
}
}
Обратите внимание, что это задание cron можно включить или выключить с помощью env var в зависимости от ваших потребностей.
sql, который я использовал для миграции схемы db через пролетный путь.
CREATE TABLE shedlock
(
name varchar(64) UNIQUE NOT NULL,
lock_until timestamp(3) NOT NULL,
locked_at timestamp(3) NOT NULL,
locked_by varchar(36) NOT NULL,
CONSTRAINT pk_schedlock_name PRIMARY KEY (name)
);
Существует множество онлайн-генераторов cron, которые помогут вам сгенерировать выражение cron.
Вы написали, что вам нужно запускать задание каждые 10 минут, поэтому правильное выражение для него "*/10 * * * * *"
.
Если у вас есть дополнительные вопросы, просьба сообщить подробности. :)