如何在骆驼中拥有一次性路线?

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)&region=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)&region=REGION")
.process(new KillRouteProcessor());

工作原理: S3 和 SFTP 上传路由正常工作。

要求:

  1. 如果能分享代码就好了。两条路线中可能存在一些不同的参数/处理器。
  2. 两个路由执行后需要删除文件。
  3. 我们需要在上传后终止路由,因为每个请求都有不同的文件名。
  4. 以上两条路由无法合并为一条,因为实际路由中的 if-else 条件太多,这会使事情变得更加复杂。
  5. 路线应该是可选的(例如,选择上传到 s3/sftp 或两者都应该可用)

我尝试过的:

  1. Camel Direct:它有助于代码重用,但它不允许多个消费者(在我的例子中是这两条路线)
  2. Camel Seda:它允许多个消费者,但它似乎不允许同步路由。
  3. 正在删除 camel 上下文之外的文件。这是一个问题,因为我们不知道路由上传文件需要多少时间。

环境:
骆驼 3.4.3,Spring 引导 2.2.3,Java8,

我设法通过使用静态路由 ID 使其正常工作(已删除 LocalDateTime.now())。这是我在解决 Camel 问题时学到的东西。

  1. 始终为每条路线提供路线 ID。特别是在使用 'direct' 路线时。
  2. 切勿使用动态路由 ID。这是非常重要的。当我在我的路线 ID 中使用 LocalDateTime.now() 时,我看到了这个问题。我在更改之前看到了这个错误:

Multiple consumers for the same endpoint is not allowed: direct://routeName .....

  1. 使用循环或调用任何直接路由时,始终使用 enrich。

例如。 .enrich("direct:subroute", AggregationStrategies.useOriginal()).
这会将 parent 路由的 headers 的副本共享到子路由。它将帮助您避免一些奇怪的问题。

如果您想了解更多,请随时发表评论。