0

尝试一个非常简单的骆驼路线:

from("aws-s3://javatutorial1232boomiau?amazonS3Client=#s3client&deleteAfterRead=true&fileName=My2.jsp").process(Empty2).log(LoggingLevel.INFO, "Replay Message Sent to file:s3out ${in.header.CamelAwsS3Key}")
            .to("stream:out");

我正在使用版本 2.20.2(截至今天最新)。该文件未从存储桶中删除。我已经做了一些研究,从外观上看,传递给 processCommit 方法的交换缺少任何标头。它正在寻找的标头是存储桶名称和密钥

String bucketName = exchange.getIn().getHeader(S3Constants.BUCKET_NAME, String.class);
String key = exchange.getIn().getHeader(S3Constants.KEY, String.class);

我也尝试过 to("file://Users/user/out.txt") 文件也没有被删除,并且标题似乎是文件组件的标题。

编辑:

我注意到如果我删除 .processor(Empty2) 文件将从存储桶中删除。处理器不做任何工作:

@Override
public void process(Exchange exchange) throws Exception {

    Object body = exchange.getIn().getBody();
    System.out.println("1: "+body);
    Object body2 = exchange.getOut().getBody();
    System.out.println("2: "+body2);     
}

那么,为什么没有它它会工作,而没有处理器却不能呢?如果无法使用处理器,我应该如何处理消息?

4

1 回答 1

1

正如克劳斯指出的那样,使用 exchange.getOut() 在交换机上创建传出(空)消息体。没有任何标头被复制到交易所,因此它们都丢失了。当涉及到 processCommit 时,存储桶名称和密钥的标头已丢失。

因此,要么不访问 getOut(),要么将所有标头从 In 复制到 Out。

于 2018-01-31T20:56:47.640 回答