Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Spring MVC. Проблема с шедулером.  [new]
pingwin177
Member

Откуда:
Сообщений: 3
Добрый день.
Никак не могу справиться с шедулером. Вроде бы задача простая, а получается черти-чего. Подскажите пожалуйста где я натупил. Есть приложение Spring MVC, есть несколько методов, которые должны выполняться по расписанию. Делаю, выполняются... Вроде все хорошо, а не совсем. В логах вот такая фигня:
2020-04-26 22:52:35 INFO  SheduledJob:28 - Sheduler method started
2020-04-26 22:52:35 INFO  SheduledJob:29 - Job started
2020-04-26 22:52:37 INFO  SheduledJob:28 - Sheduler method started
2020-04-26 22:52:37 INFO  SheduledJob:29 - Job started
2020-04-26 22:52:40 INFO  SheduledJob:35 - Job finished
2020-04-26 22:52:42 INFO  SheduledJob:35 - Job finished

Метод запускается дважды. Причем, как показал эксперимент, ни от реализации sheduler'а, ни от триггера запуска, это не зависит никак. Пробовал и "quartz", и аннотации spring, и cron, и фиксированную задержку - результат одинаковый. Ниже код на кварце. Задача, которая должна выполняться (логика удалена):
@Component
public class SheduledJob implements Job {

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

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        logger.info("Sheduler method started");
        logger.info("Job started");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("Job finished");
   }
}

Кусок spring configuration:
    @Bean
    public JobDetailFactoryBean jobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(SheduledJob .class);
        Map<String,Object> jobMap = new HashMap<String,Object>();
        jobMap.put("name", "RAM");
        jobDetailFactory.setJobDataAsMap(jobMap);
        jobDetailFactory.setGroup("cron");
        jobDetailFactory.setName("Sheduled Job");
        jobDetailFactory.setDurability(true);
        return jobDetailFactory;
    }

    @Bean
    public SimpleTriggerFactoryBean trigger() {
        SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
        trigger.setJobDetail(jobDetail().getObject());
        trigger.setRepeatInterval(120000);
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        return trigger;
    }

    @Bean
    public SchedulerFactoryBean scheduler() {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setTriggers(trigger().getObject());
        return schedulerFactory;
    }
30 апр 20, 19:04    [22125906]     Ответить | Цитировать Сообщить модератору
 Re: Spring MVC. Проблема с шедулером.  [new]
fixxer
Member

Откуда:
Сообщений: 791
Скорее всего из-за путаницы при создании контекста. Ответьте на два вопроса: зачем ScheduledJob аннотация @Component если он создается через FactoryBean и зачем нужны FactoryBean'ы если используется создание контекста через код и @Bean?
30 апр 20, 21:24    [22125970]     Ответить | Цитировать Сообщить модератору
 Re: Spring MVC. Проблема с шедулером.  [new]
mayton
Member

Откуда: loopback
Сообщений: 46531
Ты прикалываешся так писать? Мало одной строки?

logger.info("Sheduler method started");
logger.info("Job started");


Выведи хоть threadId.
30 апр 20, 21:38    [22125972]     Ответить | Цитировать Сообщить модератору
 Re: Spring MVC. Проблема с шедулером.  [new]
pingwin177
Member

Откуда:
Сообщений: 3
fixxer
Скорее всего из-за путаницы при создании контекста. Ответьте на два вопроса: зачем ScheduledJob аннотация @Component если он создается через FactoryBean и зачем нужны FactoryBean'ы если используется создание контекста через код и @Bean?


fixxer, за мысль спасибо, но до конца не понятно. Согласен, @Component лишний, кстати я его убрал, только толку ноль. Он скорее всего остался от эксперимента с аннотациями spring. Остальное вроде бы соответствует документации. Как его тогда правильно инициализировать?
1 май 20, 13:45    [22126191]     Ответить | Цитировать Сообщить модератору
 Re: Spring MVC. Проблема с шедулером.  [new]
pingwin177
Member

Откуда:
Сообщений: 3
mayton
Ты прикалываешся так писать? Мало одной строки?

logger.info("Sheduler method started");
logger.info("Job started");


Выведи хоть threadId.


Ну извини пожалуйста... Виноват, исправлюсь. Строка осталась поле выкусывания логики. Thread id вывел. Потоки разные.... Почему? Не понимаю... Откуда оно вообще берется?
Добавил аннотацию @DisallowConcurrentExecution - не помогло.
1 май 20, 13:57    [22126195]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить