我正在尝试使用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);
}
现在我关闭上下文,程序成功停止。
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通知来完成每个写入的文件,但我更喜欢只在整个文件夹完成时这样做一次。 谢了!
问题内容: 我正在尝试通过Homebrew安装node.js。不幸的是,我得到这个错误: 因此,我尝试手动链接节点… 没有运气,所以我尝试强制链接节点… 我在任何方面都不熟悉dtrace,而且害怕弄乱权限,所以我尝试sudo。 我尝试通过卸载节点,然后重试安装,但是没有运气。 问题答案: 现在,用于node.js的Homebrew软件包再次包含了npm,因此,当我错过了homebrew软件包中有关
我想在每个步骤之前和之后执行一些操作(而不是场景)。用cucumber怎么做? 就像jUnit中的后和前。 **我正在使用java。
有没有一种方法可以让发出数据,并且当它发出数据时(或者当它完成时)以异步方式使用该数据触发? 我的问题与此非常相似,但我试图异步调用Completable。 这是我试图实现的一个微不足道的例子: 我看到订阅映射中的Completable允许我以某种方式完成这项任务,但我不知道如何以正确的方式处理它(因为在活动中不调用此方法)。 非常感谢您的帮助,谢谢!