访问 Camel EIP bean 中消息体的元素
Accessing elements of the message body inside a Camel EIP bean
我有一个使用 Content Enricher EIP 的 Camel 路由。所以我的路线是这样的:
AggregationStrategy aggregationStrategy = new TestAggregationStrategy();
from("timer:myTimer?repeatCount=1")
.setBody(simple("{\"channel\": \"orderbook\", \"market\": \"BTC/USD\", \"type\": \"update\", \"data\": {\"time\": 1626139758.986094, \"checksum\": 195176195, \"bids\": [[32965.0, 0.0], [32962.0, 3.4015]], \"asks\": [], \"action\": \"update\"}}"))
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("market", "BTC/USD")))
.enrich("mongodb:mongo?database=dev&collection=order&operation=findOneByQuery", aggregationStrategy)
.log("Test: ${body}");
在 TestAggregationStrategy 中我有两个交换,原始和资源。
public class TestAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange original, Exchange resource) {
System.out.println("Original: " + original.getMessage().getBody().toString());
String bidsJsonQuery = "$.data.bids";
DocumentContext updateContext = JsonPath.parse(original.getMessage().getBody().toString());
List<String> updateJsonString = updateContext.read(bidsJsonQuery);
System.out.println(resource.getMessage().getBody());
//ArrayList test = (ArrayList) resource.getMessage().getBody(List.class);
Object test = resource.getMessage().getBody();
System.out.println("Test: " + test);
System.out.println("Resource: " + resource.getMessage().getBody());
return resource;
}
}
我可以使用 resource.getMessage().getBody() 获取消息内容,其中 returns 是某种对象。如果我将其放入 println(),它会打印 Mongo 文档。当我检查与调试器的资源交换时,它看起来像这样:
exchange > in > body ("Document")
其中包含哈希映射数组。在此示例中,其中一个哈希映射具有“出价”键和数组列表的值。
您可以直接访问这些值吗?数组列表?我一直在试验,但无法通过 getBody()。
您的代码(Json路径查询和转换)没问题,但“出价”不是List<String>
您在邮件正文中设置的“出价”是List<List<Double>>
。
当我使用您的 Json 字符串时,我可以像这样 Java 提取纯 Java 中的“出价”
String jsonString = "{\"channel\": \"orderbook\", \"market\": \"BTC/USD\", \"type\": \"update\", \"data\": {\"time\": 1626139758.986094, \"checksum\": 195176195, \"bids\": [[32965.0, 0.0], [32962.0, 3.4015]], \"asks\": [], \"action\": \"update\"}}";
String bidsJsonQuery = "$.data.bids";
DocumentContext updateContext = JsonPath.parse(jsonString);
List<List<Double>> bids = updateContext.read(bidsJsonQuery);
for (List<Double> bid : bids) {
for (Double singleBid : bid) {
logger.info("{}", singleBid);
}
}
记录器的输出是
32965.0
0.0
32962.0
3.4015
顺便说一句:在您的代码中,您解析了 original
消息正文。在你写的关于 resource
正文的文本中。这是您的代码中的错误吗?
我有一个使用 Content Enricher EIP 的 Camel 路由。所以我的路线是这样的:
AggregationStrategy aggregationStrategy = new TestAggregationStrategy();
from("timer:myTimer?repeatCount=1")
.setBody(simple("{\"channel\": \"orderbook\", \"market\": \"BTC/USD\", \"type\": \"update\", \"data\": {\"time\": 1626139758.986094, \"checksum\": 195176195, \"bids\": [[32965.0, 0.0], [32962.0, 3.4015]], \"asks\": [], \"action\": \"update\"}}"))
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("market", "BTC/USD")))
.enrich("mongodb:mongo?database=dev&collection=order&operation=findOneByQuery", aggregationStrategy)
.log("Test: ${body}");
在 TestAggregationStrategy 中我有两个交换,原始和资源。
public class TestAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange original, Exchange resource) {
System.out.println("Original: " + original.getMessage().getBody().toString());
String bidsJsonQuery = "$.data.bids";
DocumentContext updateContext = JsonPath.parse(original.getMessage().getBody().toString());
List<String> updateJsonString = updateContext.read(bidsJsonQuery);
System.out.println(resource.getMessage().getBody());
//ArrayList test = (ArrayList) resource.getMessage().getBody(List.class);
Object test = resource.getMessage().getBody();
System.out.println("Test: " + test);
System.out.println("Resource: " + resource.getMessage().getBody());
return resource;
}
}
我可以使用 resource.getMessage().getBody() 获取消息内容,其中 returns 是某种对象。如果我将其放入 println(),它会打印 Mongo 文档。当我检查与调试器的资源交换时,它看起来像这样:
exchange > in > body ("Document")
其中包含哈希映射数组。在此示例中,其中一个哈希映射具有“出价”键和数组列表的值。
您可以直接访问这些值吗?数组列表?我一直在试验,但无法通过 getBody()。
您的代码(Json路径查询和转换)没问题,但“出价”不是List<String>
您在邮件正文中设置的“出价”是List<List<Double>>
。
当我使用您的 Json 字符串时,我可以像这样 Java 提取纯 Java 中的“出价”
String jsonString = "{\"channel\": \"orderbook\", \"market\": \"BTC/USD\", \"type\": \"update\", \"data\": {\"time\": 1626139758.986094, \"checksum\": 195176195, \"bids\": [[32965.0, 0.0], [32962.0, 3.4015]], \"asks\": [], \"action\": \"update\"}}";
String bidsJsonQuery = "$.data.bids";
DocumentContext updateContext = JsonPath.parse(jsonString);
List<List<Double>> bids = updateContext.read(bidsJsonQuery);
for (List<Double> bid : bids) {
for (Double singleBid : bid) {
logger.info("{}", singleBid);
}
}
记录器的输出是
32965.0
0.0
32962.0
3.4015
顺便说一句:在您的代码中,您解析了 original
消息正文。在你写的关于 resource
正文的文本中。这是您的代码中的错误吗?