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

问题描述

用例: 当用户点击一个端点时,我们会生成一个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",true)
.process(new SomeComplexProcessor())
.to("aws-s3:bucketName?accessKey=ACCESS_KEY&secretKey=RAW(SECRET_KEY)&region=REGION")
.setHeader(FILE_NAME,MetadataFile.class)
.to("aws-s3:bucketName?accessKey=ACCESS_KEY&secretKey=RAW(SECRET_KEY)&region=REGION")
.process(new KillRouteProcessor());

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

要求:

@H_502_18@
  • 如果代码可以共享,那就太好了。两条路径中可能存在一些不同的参数/处理器。
  • 两个路径都执行后,需要删除文件
  • 我们需要在上传后终止路由,因为每个请求的文件名都不同。
  • 以上两条路由不能合并为一条,因为实际路由中的if-else条件太多,这使情况更加复杂。
  • 路由应该是可选的(例如,可以选择上传到s3 / sftp或两者都可用)
  • 我尝试过的事情:

    @H_502_18@
  • Camel Direct:它有助于代码重用,但不允许多个使用者(在我的情况下,这是两条路线)
  • 骆驼色达:它允许多个使用者,但似乎不允许同步路线。
  • 删除骆驼上下文之外的文件。这是一个问题,因为我们不知道路由将花费多少时间来上传文件
  • 环境:
    骆驼3.4.3,Spring Boot 2.2.3,Java8,

    解决方法

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

    1. 始终提供每条路线的路线ID。尤其是在使用“直接”路线时。
    2. 请勿使用动态路由ID。这个非常重要。在路由ID中使用LocalDateTime.now()时,我看到了这个问题。在更改之前,我已经看到此错误:

    不允许同一端点有多个使用者:direct:// routeName .....

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

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

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