ЮНИТ. тестирование аннотации @Scheduled запускает более одного потокаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ЮНИТ. тестирование аннотации @Scheduled запускает более одного потока

Сообщение Anonymous »

У меня есть приложение Spring Boot, и я создал метод с аннотацией @Scheduled, который принимает выражение cron в качестве параметра (скажем, он должен запускаться каждые 5 секунд). Плановый метод следующий (для примера я вывожу только распечатку на экран)

Код: Выделить всё

@Component
public class ElaborazioneEventi {

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

@Scheduled(cron = "0/5 * * * * *")
public void elaborazioneEventi() throws JsonProcessingException {

System.out.println(Thread.currentThread().getName() + " " + new Date());

}
Конфигурация планирования — это единственная аннотация @EnableScheduling в основном классе приложения.
Для моего приложения существует несколько тестовых классов JUnit (которые выполняют не тестировать запланированные методы) и два класса, которые тестируют два метода, аннотированные @Scheduled.
В этом обсуждении представляет интерес следующий тестовый класс

Код: Выделить всё

@SpringBootTest
@SpringJUnitConfig(Application.class)
@RunWith(SpringRunner.class)
public class ElaborazioneEventiTest {

@Autowired
private A4gtNprElaborazioneEventoRepository a4gtNprElaborazioneEventoRepository;

@Test
@Sql(scripts = {"/sql/eventi/delete_elaborazione_eventi.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = {"/sql/eventi/insert_elaborazione_eventi.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = {"/sql/eventi/delete_elaborazione_eventi.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)

public void batchGiaInEsecuzioneTest() throws InterruptedException {

List eventi = a4gtNprElaborazioneEventoRepository.findAll();
System.out.println("eventi presenti: " + eventi.size());

A4gtNprElaborazioneEventoModel a4gtNprElaborazioneEventoModel = new A4gtNprElaborazioneEventoModel();
a4gtNprElaborazioneEventoModel.setDataInizioElaborazione(new Timestamp(Utils.convertStringToDate("24/12/2024 13:41:55", "DD/MM/YYYY HH:mm:SS").getTime()));
a4gtNprElaborazioneEventoModel.setFlagStopElaborazione(new BigDecimal(0));
a4gtNprElaborazioneEventoModel.setStatoElaborazione(new BigDecimal(0));
a4gtNprElaborazioneEventoRepository.save(a4gtNprElaborazioneEventoModel);

Thread.currentThread().sleep(5000);

eventi = a4gtNprElaborazioneEventoRepository.findAll();

System.out.println("eventi presenti dopo la insert: "  + eventi.size());

assertTrue(eventi.size() == 2);
}
}
Что я заметил, так это то, что если я запускаю приложение в обычном режиме, выполнение начинается каждые 5 секунд, а при запуске тестовых классов (я тестирую тестовые классы все вместе) это как если бы приложение запускается, а затем запускается метод по расписанию, когда он еще не успел выполнить тест для этого метода, я также заметил, что выполнение не начинается каждые 5 секунд, а несколько выполнений запускаются одновременно каждые 5 секунд, как видно из следующего журнала (объявление sono riuscito есть только одна строка журнала):

Код: Выделить всё

eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:00 CET 2024
eventStoreSchedulerMultiEventPool2 Sun Dec 29 09:41:00 CET 2024
eventStoreSchedulerMultiEventPool2 Sun Dec 29 09:41:00 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:00 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:00 CET 2024
eventStoreSchedulerMultiEventPool2 Sun Dec 29 09:41:05 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:05 CET 2024
eventStoreSchedulerMultiEventPool2 Sun Dec 29 09:41:05 CET 2024
eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:05 CET 2024
eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:05 CET 2024
eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:10 CET 2024
eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:10 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:10 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:10 CET 2024
eventStoreSchedulerMultiEventPool5 Sun Dec 29 09:41:10 CET 2024
eventStoreSchedulerMultiEventPool5 Sun Dec 29 09:41:15 CET 2024
eventStoreSchedulerMultiEventPool2 Sun Dec 29 09:41:15 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:15 CET 2024
eventStoreSchedulerMultiEventPool3 Sun Dec 29 09:41:15 CET 2024
eventStoreSchedulerMultiEventPool1 Sun Dec 29 09:41:15 CET 2024
С каждым выполнением количество потоков увеличивается, сначала одновременно запускаются 2, затем каждые 5 секунд добавляются другие. Я хочу, чтобы во время выполнения тестов Junit запускался только один экземпляр запланированного метода, как и происходит, если я запускаю приложение. Как мне настроить юниты, чтобы это произошло?

Подробнее здесь: https://stackoverflow.com/questions/793 ... one-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»