用例:当用户点击端点时,我们生成一个 csv 文件,我们希望将其上传到不同的源(FTP 和 S3)。我们需要在上传之前对文件进行加密和转换。以下是路线的样子(过于简化):
FTP 路由:
from("file:temp?include=sample.csv&noop=true")
.routeId("ftpRoute" + LocalDateTime.now())
.marshal().pgp("file:temp/encryptionKey.asc", "someuserid", null, true, true)
.process(new SomeComplexProcessor())
.to("sftp:localhost:22/destinationDir?username=username&password=RAW(password)")
.setHeader(FILE_NAME, "metadata.txt")
.process(new MetadataFileGenerator())
.marshal()
.bindy(BindyType.Csv, MetadataFile.class)
.to("sftp:localhost:22/destinationDir?username=username&password=RAW(password)")
.process(new KillRouteProcessor());
S3路线:
from("file:temp?include=sample.csv&noop=true")
.routeId("s3Route" + LocalDateTime.now())
.marshal().pgp("file:temp/encryptionKey.asc", "someuserid", null, true, true)
.process(new SomeComplexProcessor())
.to("aws-s3:bucketName?accessKey=ACCESS_KEY&secretKey=RAW(SECRET_KEY)®ion=REGION")
.setHeader(FILE_NAME, "metadata.txt")
.process(new MetadataFileGenerator())
.marshal()
.bindy(BindyType.Csv, MetadataFile.class)
.to("aws-s3:bucketName?accessKey=ACCESS_KEY&secretKey=RAW(SECRET_KEY)®ion=REGION")
.process(new KillRouteProcessor());
工作原理:S3 和 SFTP 上传路由正常工作。
要求:
- 如果代码可以共享就太好了。两条路线中都可能存在一些不同的参数/处理器。
- 两个路由都执行后需要删除文件。
- 我们需要在上传后终止路由,因为每个请求都有不同的文件名。
- 以上两条路线不能合并为一条,因为实际路线中有太多的 if-else 条件,这会使情况更加复杂。
- 路由应该是可选的(例如,选择上传到 s3/sftp 或两者都应该可用)
我试过的:
- Camel Direct:它有助于代码重用,但它不允许多个消费者(在我的情况下这两条路线)
- Camel Seda:它允许多个消费者,但似乎不允许同步路由。
- 删除骆驼上下文之外的文件。这是一个问题,因为我们不知道上传文件需要多少时间。
环境:
Camel 3.4.3、Spring Boot 2.2.3、Java8、