为什么Camel MongoDB组件在writeResultAsHeader=true的情况下更改主体



我使用Camel 2.10.4将文档保存到Mongo 2.10.1。作为Mongo端点配置的一部分,我指定

writeResultAsHeader=true
,这样我的消息体就不会改变,结果存储在"CamelMongoWriteResult"下的交换头中。问题是端点将其保存到头中,但也在更新主体。

我的路线配置如下:

RouteBuilder routeBuilder = new RouteBuilder(camelContext) {
  @Override
  public void configure() {
    from("direct://testMongoSave")
      .routeId("testMongoSave")
      .log("Before persist headers = ${headers}")
      .log("Before persist body = ${body}")
      .to("mongodb:mongo?database=events&collection=TEST&writeResultAsHeader=true&operation=insert&dynamicity=true")
      .process(new PrintingProcessor())
      .log("After persist headers = ${headers}")
      .log("After persist bosy = ${body}");
 }
 class PrintingProcessor implements Processor {
   @Override
   public void process(Exchange exchange) {
     LOGGER.warn("In Header {}", exchange.getIn().getHeader(MongoDbConstants.WRITERESULT));
     LOGGER.warn("In Body {}", exchange.getIn().getBody());
     LOGGER.warn("Out Body {}", exchange.hasOut() ? exchange.getOut().getBody() : "No OUT");
   }
 }

};

日志输出

10:57:14 [INFO ]SpringCamelContext: Apache Camel 2.10.4 (CamelContext: camel-1) started in 0.281 seconds
10:57:14 [INFO ]testMongoSave: Before persist headers = {breadcrumbId=ID-saket-kumar-lmuk-local-34130-1385722634064-0-1}
10:57:14 [INFO ]testMongoSave: Before persist body = { "name" : "Saket"}
10:57:14 [WARN ]CamelMongoDBTest: In Header { "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 0 , "connectionId" : 154 , "waited" : 37 , "err" :  null  , "ok" : 1.0}
10:57:14 [WARN ]CamelMongoDBTest: In Body { "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 0 , "connectionId" : 154 , "waited" : 37 , "err" :  null  , "ok" : 1.0}
10:57:14 [WARN ]CamelMongoDBTest: Out Body No OUT
10:57:14 [INFO ]testMongoSave: After persist headers = {CamelMongoWriteResult={ "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 0 , "connectionId" : 154 , "waited" : 37 , "err" :  null  , "ok" : 1.0}, breadcrumbId=ID-saket-kumar-lmuk-local-34130-1385722634064-0-1}
10:57:14 [INFO ]testMongoSave: After persist body = { "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 0 , "connectionId" : 154 , "waited" : 37 , "err" :  null  , "ok" : 1.0}

我已经查看了Camel MongoDB Producer的源代码,我认为可能存在一个错误(最后一行),我们在更新正文时没有检查writeResultAsHeader标志。

// we always return the WriteResult, because whether the getLastError was called or not, the user will have the means to call it or 
// obtain the cached CommandResult
processAndTransferWriteResult(result, exchange);
resultMessage.setBody(result);

我看到了另一个类似的问题,但的问题略有不同

有人遇到过同样的问题吗?或者我的用法不正确?

WriteResultAsHeader选项中的WriteResult是一个com.mongodb.WriteResult,由Mongo在写操作时返回。它不是指编写操作(如find)的结果。你可以保存身体前mongo调用,然后恢复是后我想。

相关内容

最新更新