【问题标题】:Apache Camel Choice(): Do NothingApache Camel Choice():什么都不做
【发布时间】:2018-01-19 00:17:59
【问题描述】:

我使用 Apache Camel 制作了一个与 AWS S3 完美集成的应用程序。代码如下:

Predicate newFilePred = header(NEW_FILE_RECEIVED_HEADER).isEqualTo(SUCCESS);
from(incomingEndpoint)
        .process((exchange) -> {
            logger.info("Checking S3 bucket.");
            Date newFileUploadDate = (Date) exchange.getIn().getHeaders().get("CamelAwsS3LastModified");
            if (fileIsNew(newFileUploadDate))
                exchange.getIn().setHeader(NEW_FILE_RECEIVED_HEADER, SUCCESS);
            } else {
                exchange.getIn().setHeader(NEW_FILE_RECEIVED_HEADER, FAILURE);
            }
        })
        .choice()
            .when(newFilePred)
            .to(outgoingEndpoint)
        .endChoice()
        .end();

该应用程序运行良好,但它会抛出一个非常烦人的警告,如下所示:

Camel Thread #1 - aws-s3://mybucket] | c.a.s.s.i.S3AbortableInputStream Not all bytes were read from the
S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. 
Request only the bytes you need via a ranged GET or drain the input stream after use. request_id= 

我知道问题是如果标题“NEW_FILE_RECEIVED_HEADER”设置为失败,我不会将文件的输出定向到任何地方。这是设计使然,因为在这种情况下我不想下载该文件。在我将文件识别为“不需要”之后,是否有告诉 Camel 正确中止连接?我可以创建另一个直接到“垃圾”目录的骆驼路线,但这些都是无用的循环。

感谢您的帮助!

【问题讨论】:

  • 我不这么认为,正如您从 AWS 本身的文本中看到的那样,您需要排空流。我假设您无法提前知道是否要跳过此文件,因此您不能在 GET 调用中限制字节数。
  • 如果是这种情况,那么我相信在有意取消的情况下抑制此警告会很好。您是否认为这足以进行增强?

标签: amazon-s3 apache-camel


【解决方案1】:

由于缺乏更好的解决方案,我设法通过实现垃圾/失败路由来消除这些消息,该路由完成来自 S3 的 http get/input 流。

如果有人提出了更好的方法或完全不同的方法,请随时“击败”这个答案。发现的基本规则是需要完成的路线(A -> B),否则将引发警告。除非您像我一样查看受污染的日志文件,否则警告是无害的。

完成的路由条件如下所示:

.choice()
   .when(newFilePred)
      .to(successfulOutgoingEndpoint)
   .otherwise()
      .to(failureOutgoingEndpoint);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2016-12-24
    • 2017-04-18
    • 2011-08-03
    • 2014-05-11
    相关资源
    最近更新 更多