@ запланированные задания иногда выполняются, иногда нет - PullRequest
0 голосов
/ 16 июня 2020

Я работаю над проектом springboot, я создал планировщик, который должен запускаться через каждые 10 минут, у меня есть два модуля, на которых работает @shedlock, также реализован, но иногда он запускается, иногда не запускается и не выдает никаких ошибок, после когда-то снова он начал выполняться. Может ли кто-нибудь помочь в этом

1 Ответ

0 голосов
/ 16 июня 2020

, так что приведенной информации не так уж и много. Я могу показать вам рабочий пример в распределенной системе, который, как я полагаю, у вас есть, поскольку вы упомянули поды, что означает, что ваш сервис находится в 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 * * * * *".

Если у вас есть дополнительные вопросы, просьба сообщить подробности. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...