当前位置: 首页 > 知识库问答 >
问题:

完成后,Spring batch步骤不会自行停止

沈栋
2023-03-14

我正在尝试使用Spring批处理和Spring集成在SFTP服务器中上传多个文件。为此,我使用ThreadPoolTaskExector进行并行处理。

在每个进程中执行文件上传,但是即使所有的文件都在SFTP服务器上成功上传,仍然没有停止进程,程序总是保持运行状态。

即使我重写了JobExefftionListener

@Bean
public JobExecutionListener jobExecutionListener(ThreadPoolTaskExecutor executor) {
    return new JobExecutionListener() {
        private ThreadPoolTaskExecutor taskExecutor = executor;
        @Override
        public void beforeJob(JobExecution jobExecution) {

        }

        @Override
        public void afterJob(JobExecution jobExecution) {
            taskExecutor.shutdown();
        }
    };
}

@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor()
{
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.initialize();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(10);
    executor.setThreadNamePrefix("quantum-runtime-worker-thread");
    executor.setWaitForTasksToCompleteOnShutdown(true);
    return executor;
}


@Bean
public Step uploadFiles()
{
    return stepBuilderFactory.get(UPLOAD_FILE_STEP_NAME).tasklet(new Tasklet() {

        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception
        {
            log.info("Upload tasklet start executing..");

            resources = resourcePatternResolver.getResources(inputFilesPath);

            for (Resource anInputResource : resources)
            {
                log.info("Incoming file <{}> to upload....", anInputResource.getFilename());
                threadPoolTaskExecutor().execute(new Runnable() {
                    @Override
                    public void run()
                    {
                        File zippedFile = null;
                        try
                        {
                            log.info("Uploading file : {}", anInputResource.getFilename());
                            gateway.upload(zippedFile);
                            log.info("{} file uploaded : {}", anInputResource.getFilename(), zippedFile.delete());
                        }
                        catch (Exception e)
                        {
                            log.error("Error occured while uploading a  file : {} and the exception is {}",
                                    anInputResource.getFilename(), e);

                        }
                    }
                });

            }
            System.out.println("=============POINTER NOT COMMING HERE================");
            return RepeatStatus.FINISHED;
        }
    }).build();
}

@Bean
@ServiceActivator(inputChannel = SFTP_CHANNEL_NAME)
public MessageHandler handler()
{
    SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpression(new LiteralExpression("/"));
    handler.setFileNameGenerator(new FileNameGenerator() {
        @Override
        public String generateFileName(Message<?> message)
        {
            if (message.getPayload() instanceof File)
            {
                return ((File) message.getPayload()).getName();
            }
            else
            {
                throw new IllegalArgumentException("File expected as payload.");
            }
        }
    });
    return handler;
}

@MessagingGateway
@Component
public interface UploadGateway {

    @Gateway(requestChannel = SFTP_CHANNEL_NAME)
    void upload(File file);
}

共有1个答案

红朝
2023-03-14

现在我关闭上下文,程序成功停止。

ConfigurableApplicationContext context = new SpringApplicationBuilder(QuantumFileUploadApplication.class).web(false).run(args);
    context.close();// it works
 类似资料:
  • 下面是JobLauncher.run()返回的JobExecution的内容,它发出作业运行成功的信号。 JobExecution:ID=0,Version=2,StartTime=Fri Nov 27 06:05:23 CST 2015,EndTime=Fri Nov 27 06:05:39 CST 2015,LastUpdated=Fri Nov 27 06:05:39 CST 2015,St

  • 我知道我可以用云函数和PubSub通知来完成每个写入的文件,但我更喜欢只在整个文件夹完成时这样做一次。 谢了!

  • 我想在每个步骤之前和之后执行一些操作(而不是场景)。用cucumber怎么做? 就像jUnit中的后和前。 **我正在使用java。

  • 问题内容: 我正在尝试通过Homebrew安装node.js。不幸的是,我得到这个错误: 因此,我尝试手动链接节点… 没有运气,所以我尝试强制链接节点… 我在任何方面都不熟悉dtrace,而且害怕弄乱权限,所以我尝试sudo。 我尝试通过卸载节点,然后重试安装,但是没有运气。 问题答案: 现在,用于node.js的Homebrew软件包再次包含了npm,因此,当我错过了homebrew软件包中有关

  • 有没有一种方法可以让发出数据,并且当它发出数据时(或者当它完成时)以异步方式使用该数据触发? 我的问题与此非常相似,但我试图异步调用Completable。 这是我试图实现的一个微不足道的例子: 我看到订阅映射中的Completable允许我以某种方式完成这项任务,但我不知道如何以正确的方式处理它(因为在活动中不调用此方法)。 非常感谢您的帮助,谢谢!