java - 使用 Apache Camel 根据 S3 事件通知传输 S3 文件

标签 java amazon-s3 apache-camel amazon-sqs

我有一个应用程序(在 EC2 实例上运行)解析到达 S3 存储桶的新日志文件。我已经在此存储桶上设置了 S3 通知,以根据 PUT 请求将消息放入 SQS 队列。目的是将新到达的日志文件从 S3 传输到 EC2 实例。

我认为 Apache Camel 是解决这个问题的理想人选。我对解决方案有以下问题/观察,非常感谢对此的一些反馈:

  1. 我们可以使用 Camel 路由从 SQS 读取消息,然后从 JSON 消息中提取对象键。是否可以在将此对象从 S3 复制到本地 FS 的另一个 Camel 路由(使用 S3 组件)中使用此对象键?从外观上看,Camel S3 组件似乎只能处理桶中的新对象,因为它只在 URI 中使用桶名称。因此,可能无法从 S3 存储桶复制特定 key 。此外,我不确定是否可以在 Camel 中使用动态 URI,因为每次对象名称都会不同。

  2. 如果 Camel S3 组件确实能够处理到达 S3 桶中的新对象,那么我们完全不需要 S3 通知。但这有一个问题(因为它是无状态的),如果由于某种原因这个应用程序出现故障,那么它将错过在停机期间到达的对象。

  3. 另一种可能性是使用 Camel 从 SQS 读取消息,处理这些消息并使用普通 Java 类从 S3 复制对象。但是这种并没有充分发挥Apache Camel的优势。

最佳答案

有一个 SNS 来分离文件处理和文件传输是件好事。但你真的需要这个吗?它会增加你的应用程序的复杂性。如果您只是想将传入的文件无遗漏地处理到 S3 存储桶,最简单的方法是创建一个存储桶说“传入”,另一个调用“已处理”。每次您的应用程序都可以扫描传入的存储桶并对其进行处理,完成后将文件放入已处理的存储桶中。

您需要注意的一件事是标记正在处理的文件以避免冲突。你可以给它加上特殊的后缀。

AWS 还提供第三种方式来执行“事件通知”调用“Lambda 函数”。你也可以看看那个。它可以启用一些简单的处理程序,不需要自己编写额外的应用程序。

关于java - 使用 Apache Camel 根据 S3 事件通知传输 S3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27951067/

相关文章:

java - 除非 schema_version 表在数据库中,否则 Flyway 基线不起作用

java - 无法让二维数组进行洗牌

amazon-s3 - 是否有本地提供 Amazon S3 风格 API 的服务器?

java - Apache Camel : What is the best way to reuse Camel routes from other routes?

java - getter 和 setter findbugs 可能会暴露内部表示

java - 如何从 Condition Autowiring 属性 bean

恰好 120 秒后 HTTP 504 超时

amazon-web-services - 从 S3 加载 Redshift(带分区)

java - 即使在 @Converter 注释中将 allowNull 设置为 true,Camel TypeConverter 仍会抛出 NoTypeConversionAvailableException

java - 使用 Apache Camel,如何向已经很大的文件添加一些行?