如何在骆驼中拥有一次性路线?
How to have disposable routes in Camel?
用例:
当用户点击一个端点时,我们会生成一个 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 引导 2.2.3,Java8,
我设法通过使用静态路由 ID 使其正常工作(已删除 LocalDateTime.now())。这是我在解决 Camel 问题时学到的东西。
- 始终为每条路线提供路线 ID。特别是在使用 'direct' 路线时。
- 切勿使用动态路由 ID。这是非常重要的。当我在我的路线 ID 中使用
LocalDateTime.now()
时,我看到了这个问题。我在更改之前看到了这个错误:
Multiple consumers for the same endpoint is not allowed: direct://routeName .....
- 使用循环或调用任何直接路由时,始终使用 enrich。
例如。 .enrich("direct:subroute", AggregationStrategies.useOriginal())
.
这会将 parent 路由的 headers 的副本共享到子路由。它将帮助您避免一些奇怪的问题。
如果您想了解更多,请随时发表评论。
用例: 当用户点击一个端点时,我们会生成一个 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 引导 2.2.3,Java8,
我设法通过使用静态路由 ID 使其正常工作(已删除 LocalDateTime.now())。这是我在解决 Camel 问题时学到的东西。
- 始终为每条路线提供路线 ID。特别是在使用 'direct' 路线时。
- 切勿使用动态路由 ID。这是非常重要的。当我在我的路线 ID 中使用
LocalDateTime.now()
时,我看到了这个问题。我在更改之前看到了这个错误:
Multiple consumers for the same endpoint is not allowed: direct://routeName .....
- 使用循环或调用任何直接路由时,始终使用 enrich。
例如。 .enrich("direct:subroute", AggregationStrategies.useOriginal())
.
这会将 parent 路由的 headers 的副本共享到子路由。它将帮助您避免一些奇怪的问题。
如果您想了解更多,请随时发表评论。