使用 Spring 集成轮询文件的 S3 存储桶
Polling S3 Bucket for file using Spring integration
我正在做一个项目,我需要轮询 S3 存储桶中的文件并上传到不同的 S3 存储桶中。作为实施它的第一步,我正在尝试轮询 S3 存储桶以获取创建的新文件,并使用 Spring 集成在我的本地目录中创建它们。为了实现这一点,我创建了一个简单的 spring-boot 应用程序,其中包含以下对象轮询配置的 Maven,同时处理文件读取 IntegrationFlow
@Configuration
@EnableIntegration
@IntegrationComponentScan
@EnableAsync
public class ObjectPollerConfiguration {
@Value("${amazonProperties.bucketName}")
private String bucketName;
public static final String OUTPUT_DIR2 = "target2";
@Autowired
private AmazonClient amazonClient;
@Bean
public S3InboundFileSynchronizer s3InboundFileSynchronizer() {
S3InboundFileSynchronizer synchronizer = new S3InboundFileSynchronizer(amazonClient.getS3Client());
synchronizer.setDeleteRemoteFiles(true);
synchronizer.setPreserveTimestamp(true);
synchronizer.setRemoteDirectory(bucketName);
return synchronizer;
}
@Bean
@InboundChannelAdapter(value = "s3FilesChannel", poller = @Poller(fixedDelay = "30"))
public S3InboundFileSynchronizingMessageSource s3InboundFileSynchronizingMessageSource() {
S3InboundFileSynchronizingMessageSource messageSource =
new S3InboundFileSynchronizingMessageSource(s3InboundFileSynchronizer());
messageSource.setAutoCreateLocalDirectory(true);
messageSource.setLocalDirectory(new File("."));
messageSource.setLocalFilter(new AcceptOnceFileListFilter<File>());
return messageSource;
}
@Bean
public PollableChannel s3FilesChannel() {
return new QueueChannel();
}
@Bean
IntegrationFlow fileReadingFlow() {
return IntegrationFlows
.from(s3InboundFileSynchronizingMessageSource(),
e -> e.poller(p -> p.fixedDelay(30, TimeUnit.SECONDS)))
.handle(fileProcessor())
.get();
}
@Bean
public MessageHandler fileProcessor() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(OUTPUT_DIR2));
handler.setExpectReply(false); // end of pipeline, reply not needed
return handler;
}
}*
但是当我将我的应用程序作为 java 应用程序启动并将文件上传到 S3 时,我没有看到包含文件的 target2 目录,也没有获得任何与轮询执行相对应的日志。有人可以帮我让它工作吗?
我认为问题是您没有使用 OUTPUT_DIR2
属性 作为本地目录推入。
你的本地目录代码是这样的:
messageSource.setLocalDirectory(new File("."));
这完全不是您要找的。
尝试将其更改为
messageSource.setLocalDirectory(new File(OUTPUT_DIR2));
我正在做一个项目,我需要轮询 S3 存储桶中的文件并上传到不同的 S3 存储桶中。作为实施它的第一步,我正在尝试轮询 S3 存储桶以获取创建的新文件,并使用 Spring 集成在我的本地目录中创建它们。为了实现这一点,我创建了一个简单的 spring-boot 应用程序,其中包含以下对象轮询配置的 Maven,同时处理文件读取 IntegrationFlow
@Configuration
@EnableIntegration
@IntegrationComponentScan
@EnableAsync
public class ObjectPollerConfiguration {
@Value("${amazonProperties.bucketName}")
private String bucketName;
public static final String OUTPUT_DIR2 = "target2";
@Autowired
private AmazonClient amazonClient;
@Bean
public S3InboundFileSynchronizer s3InboundFileSynchronizer() {
S3InboundFileSynchronizer synchronizer = new S3InboundFileSynchronizer(amazonClient.getS3Client());
synchronizer.setDeleteRemoteFiles(true);
synchronizer.setPreserveTimestamp(true);
synchronizer.setRemoteDirectory(bucketName);
return synchronizer;
}
@Bean
@InboundChannelAdapter(value = "s3FilesChannel", poller = @Poller(fixedDelay = "30"))
public S3InboundFileSynchronizingMessageSource s3InboundFileSynchronizingMessageSource() {
S3InboundFileSynchronizingMessageSource messageSource =
new S3InboundFileSynchronizingMessageSource(s3InboundFileSynchronizer());
messageSource.setAutoCreateLocalDirectory(true);
messageSource.setLocalDirectory(new File("."));
messageSource.setLocalFilter(new AcceptOnceFileListFilter<File>());
return messageSource;
}
@Bean
public PollableChannel s3FilesChannel() {
return new QueueChannel();
}
@Bean
IntegrationFlow fileReadingFlow() {
return IntegrationFlows
.from(s3InboundFileSynchronizingMessageSource(),
e -> e.poller(p -> p.fixedDelay(30, TimeUnit.SECONDS)))
.handle(fileProcessor())
.get();
}
@Bean
public MessageHandler fileProcessor() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(OUTPUT_DIR2));
handler.setExpectReply(false); // end of pipeline, reply not needed
return handler;
}
}*
但是当我将我的应用程序作为 java 应用程序启动并将文件上传到 S3 时,我没有看到包含文件的 target2 目录,也没有获得任何与轮询执行相对应的日志。有人可以帮我让它工作吗?
我认为问题是您没有使用 OUTPUT_DIR2
属性 作为本地目录推入。
你的本地目录代码是这样的:
messageSource.setLocalDirectory(new File("."));
这完全不是您要找的。 尝试将其更改为
messageSource.setLocalDirectory(new File(OUTPUT_DIR2));