发出从SkipListener检索ExecutionContext的问题

问题描述 投票:1回答:2

我试图从ExecutionContext检索弹簧批次SkipListener

这是我尝试过的(我依靠注释而不是接口来实现我的侦听器):

import com.xxxx.domain.UserAccount;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.annotation.OnSkipInWrite;
import org.springframework.mail.MailSendException;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class MailSkipListener {

    private StepExecution stepExecution;

    @BeforeStep
    public void saveStepExecution(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @OnSkipInWrite
    public void logSkippedEmail(UserAccount userAccount, Throwable t) {
        if (t instanceof MailSendException) {
            MailSendException e = (MailSendException) t;
            log.warn("FailedMessages: " + e.getFailedMessages());
        }
    }
}

然而,当logSkippedEmail被提升时,MailSendException方法永远不会被执行。当我删除saveStepExecution方法时,logSkippedEmail再次执行MailSendException

我注册我的MailSkipListener如下:

@Bean
public Step messagesDigestMailingStep(EntityManagerFactory entityManagerFactory) {
    return stepBuilderFactory
            .get("messagesDigestMailingStep")
            .<UserAccount, UserAccount>chunk(5)

            ...

            .writer(itemWriter)
            .listener(mailSkipListener)//Here
            .build();
}

我想在这里实现的是从我的ExecutionContext中检索SkipListener。怎么能实现这一目标?似乎没有办法自动装载theExecutionContext

spring-batch
2个回答
0
投票

您可以在StepExecutionListener上实现MailSkipListener以在stepExecution方法中保存beforeStep()中的上下文:

public class MailSkipListener implements StepExecutionListener {

    @Override
    public void beforeStep(StepExecution stepExecution) {
         this.stepExecution = stepExecution;
    }

0
投票

这是一个相当古老的问题,但我也在努力解决这个问题。我最后两次注册skiplistener以使其工作,一次作为StepExecutionListener而另一次作为SkipListener。它很糟糕,但它似乎工作:

@Bean
public Step messagesDigestMailingStep(EntityManagerFactory entityManagerFactory) {
    return stepBuilderFactory
        .get("messagesDigestMailingStep")
        .<UserAccount, UserAccount>chunk(5)

        ...

        .writer(itemWriter)
        .listener((StepExecutionListener) mailSkipListener) // <--- 1
        .listener((SkipListener) mailSkipListener)          // <--- 2
        .build();
}
© www.soinside.com 2019 - 2024. All rights reserved.