JUNIT. Beim Testen der @Scheduled-Annotation wird mehr als ein Thread gestartetJava

Java-Forum
Anonymous
 JUNIT. Beim Testen der @Scheduled-Annotation wird mehr als ein Thread gestartet

Post by Anonymous »

Ich habe eine Spring Boot-Anwendung und habe eine Methode mit der Annotation @Scheduled erstellt, die einen Cron-Ausdruck als Parameter verwendet (sagen wir, sie muss alle 5 Sekunden ausgeführt werden). Die geplante Methode ist wie folgt (als Beispiel lege ich nur einen Ausdruck auf den Bildschirm)

Code: Select all

@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());

}
Die Konfiguration für die Planung ist die einzelne @EnableScheduling-Annotation für die Hauptanwendungsklasse.
Für meine Anwendung gibt es mehrere JUnit-Testklassen (die das tun). keine geplanten Methoden testen) und zwei Klassen, die zwei mit @Scheduled annotierte Methoden testen.
Die für diese Diskussion interessante Testklasse ist die folgende

Code: Select all

@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);
}
}
Was mir aufgefallen ist, ist, dass, wenn ich die Anwendung normal starte, alle 5 Sekunden eine Ausführung startet, während es beim Starten der Testklassen (ich teste die Testklassen alle zusammen) so ist, als ob die Anwendung startet und dann die Methode startet geplant, wenn er es noch nicht geschafft hat, den Test für diese Methode auszuführen, ist mir auch aufgefallen, dass nicht alle 5 Sekunden eine Ausführung startet, sondern mehrere Ausführungen gleichzeitig alle 5 Sekunden starten, wie man sehen kann aus dem folgenden Protokoll (sono riuscito ad Nur diese Zeile aus dem Protokoll lesen):

Code: Select all

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
Mit jeder Ausführung erhöht sich die Anzahl der Threads, zunächst starten 2 gleichzeitig, dann kommen alle 5 Sekunden weitere hinzu. Ich möchte, dass während der Ausführung der Junit-Tests nur eine Instanz der geplanten Methode gestartet wird, wie es zu Recht der Fall ist, wenn ich die Anwendung ausführe. Wie muss ich die Junits konfigurieren, um dies zu ermöglichen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post