Saya memiliki langkah batch Spring yang menjalankan tasklet yang melakukan polling untuk file di server jarak jauh:

public class MyConfiguration extends AbstractConfiguration {
   
    @Bean
    @Qualifier("pollStep")
    public Step pollStep() {
        return stepBuilderFactory.get("pollStep")
                                 .tasklet(filePollingTasklet())
                                 .listener(promoteContextListener())
                                 .build();
    }

    @Bean
    @StepScope
    private Tasklet filePollingTasklet() {
        return ((stepContribution, chunkContext) -> getStatus(stepContribution, chunkContext));
    }

    private RepeatStatus getStatus(StepContribution stepContribution, ChunkContext chunkContext) {
        //some code
        Map<String, Boolean> result = poller.pollForFile(myContext, sourceInfo);
        return RepeatStatus.FINISHED;
    }

}

Ini polling hingga 100 menit, mencoba lagi sesering...

Ketika keluar dari while loop polling untuk file dalam metode pollForFile(), itu melempar RuntimeException jika tidak dapat menemukan file.

Tabel EKSEKUSI LANGKAH batch pegas mencatat PESAN KELUAR untuk langkah ini dengan pengecualian sebagai berikut ketika batch gagal dalam hal ini:

org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connectionat org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:565)at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:835)at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at com.sun.proxy.$Proxy177.rollback(Unknown Source)at org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:168)at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:144)at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273)at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82)at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258)at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208)at org.spring

Saya ingin memahami mengapa pesan keluar adalah kesalahan rollback jpa dan bukan pengecualian runtime? Bagaimana saya bisa memastikan bahwa dalam hal ini pesan pengecualian runtime adalah apa yang disimpan di Pesan Keluar di tabel batch pegas ketika langkahnya gagal.

1
M06H 10 Mei 2021, 19:35

1 menjawab

Jawaban Terbaik

Saya ingin memahami mengapa pesan keluar adalah kesalahan rollback jpa dan bukan pengecualian runtime?

Karena hal inilah yang justru membuat langkah Anda gagal. Jejak tumpukan yang Anda bagikan terpotong, tetapi pengecualian waktu proses harus menjadi penyebab org.springframework.transaction.TransactionSystemException, yang pada gilirannya menjadi penyebab kegagalan langkah Anda.

0
Mahmoud Ben Hassine 11 Mei 2021, 08:33