我使用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调用,然后恢复是后我想。