2

Amazon S3 にファイルをアップロードするこのタスクレットがあります。AmazonClientExceptionここで、がスローされるたびにタスクレットの実行を再試行したいと考えています。@Retryableアノテーションを使用するとうまくいくと思いました。

タスクレット:

@Component
@StepScope
@Retryable(value=AmazonClientException.class, stateful=true, backoff=@Backoff(2000))
public class S3UploadTasklet extends ArgsSupport implements Tasklet {

    @Autowired
    private S3Client s3Client;

    @Autowired
    private S3Properties s3Properties;

    private static final Logger LOGGER = LoggerFactory.getLogger(S3UploadTasklet.class);

    private static final String FILE_EXTENSION = ".gpg";

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        try {
            String localFilename = getTempOutputFilename() + FILE_EXTENSION;
            String s3Filename = s3Properties.getReportPath() + getS3OutputFilename() + FILE_EXTENSION;
            File f = new File(localFilename);
            if(f.exists()) {
                LOGGER.info("Uploading " + localFilename + " to s3...");
                s3Client.upload(localFilename, s3Filename, s3Properties.getBucketName());
                LOGGER.info("Uploading done!");
            } else {
                throw new RuntimeException("Encrypted file not found! Encryption process might have failed.");
            }
        } catch(AmazonClientException e) {
            LOGGER.error("Problems uploading to S3. " + e.getMessage(), e);
            throw e;
        } catch(RuntimeException e) {
            LOGGER.error("Runtime error occured. " + e.getMessage(), e);
            throw e;
        }

        return RepeatStatus.FINISHED;
    }
}

ジョブ構成:

@Configuration
@EnableBatchProcessing
@EnableRetry
public class BatchConfiguration {
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private Step generateReport;

    @Autowired
    private Step encrypt;

    @Autowired
    private Step upload;

    @Autowired
    private Step cleanUp;

    @Bean
    @Transactional(value="appTransactionManager", isolation=Isolation.READ_COMMITTED)
    public Job generateReconJob() {
        return jobBuilderFactory.get("reconJob")
                .incrementer(new RunIdIncrementer())
                .start(generateReport)
                    .on("COMPLETED").to(encrypt)
                .from(generateReport)
                    .on("NOOP").end()
                .from(generateReport)
                    .on("FAILED").to(cleanUp)
                .from(encrypt)
                    .on("COMPLETED").to(upload)
                .from(encrypt)
                    .on("FAILED").to(cleanUp)
                .from(upload)
                    .on("*").to(cleanUp)
                .from(cleanUp)
                    .on("*").end()
                .end()
                .build();
    }
}

しかし、それはそれがするべきことをしません。例外がスローされたときに、バッチ ジョブはまだタスクレットを再試行しません。

何かご意見は?

構成もこちら

@Configuration
public class ReportConfiguration {
   ...

   @Autowired
   private S3UploadTasklet s3UploadTasklet;

   ...

    @Bean
    public Step upload() {
        return stepBuilderFactory.get("upload")
                .tasklet(s3UploadTasklet)
                .build();
    }
}
4

1 に答える 1