首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring Cloud Stream聚合器处理器的aggregator.aggregation选项上使用SpEL表达式?

如何在Spring Cloud Stream聚合器处理器的aggregator.aggregation选项上使用SpEL表达式?
EN

Stack Overflow用户
提问于 2017-06-11 20:00:44
回答 1查看 597关注 0票数 0

我有三个独立的消息有效负载:

代码语言:javascript
复制
"id": "1234"

"type": "space-crite"

"attributes": {
  "ferocity": 10,
  "appetite": 10,
  "cuddliness": 0
}

我想使用Spring Cloud Stream aggregator-app-starter处理器将这三个消息有效负载合并为一个:

代码语言:javascript
复制
"id": "1234",
"type": "space-crite",
"attributes": {
  "ferocity": 10,
  "appetite": 10,
  "cuddliness": 0
}

通过使用聚合器处理器的aggregator.aggregation选项。文档指出,此属性的有效值是聚合策略的SpEL表达式,并且默认情况下它会生成有效负载的集合。aggregator processor的集成测试之一使用以下表达式:

代码语言:javascript
复制
#this.?[payload == 'foo'].![payload]

从"foo“和"bar”的单独有效负载生成"foo“的聚合消息。虽然这些测试非常有帮助,但文档中并没有提供很多关于如何在Spring Cloud Stream Starter Apps上下文中使用SpEL表达式的示例,这很遗憾,因为我知道我错过了一个非常强大的功能。

使用如下所示的表达式:

代码语言:javascript
复制
 #this

因为aggregator.aggregation属性的值创建了一个有效负载,它是GenericMessage对象的集合,每个对象都有自己的有效负载和标头属性。我希望创建一个大小为1的GenericMessage,它有一个包含3个传入消息的有效负载属性。

有没有人能给我举一些例子,告诉我如何在这个处理器选项中使用SpEL表达式?我正在尝试的事情是可能的吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-11 22:15:49

假设有效载荷是字符串...

试试get(0).payload + get(1).payload + get(2).payload

如果需要有效负载之间的换行符,请使用

代码语言:javascript
复制
T(String).format(get(0).payload + '%n' + get(1).payload + '%n' + get(2).payload)

编辑

不幸的是,聚合的#root对象是一个Collection<Message<?>>而不是一个List<Message<?>>,所以上面的方法不起作用。

您可以用new java.util.ArrayList(#root).get(0).payload等替换每个元素,但这相当难看(而且效率很低,因为您创建了一个新列表来获取每个元素)。我看看能不能想出一个更好的解决方案。

EDIT2

也许这会接近你想要的.

代码语言:javascript
复制
#root.![payload].toString()

测试:

代码语言:javascript
复制
MessageGroup g = new SimpleMessageGroup("foo");
g.add(new GenericMessage<>("foo"));
g.add(new GenericMessage<>("bar"));
Collection<Message<?>> messages = g.getMessages();
Expression e = new SpelExpressionParser().parseExpression(
        "#root.![payload].toString()");
System.out.println(e.getValue(messages));

产生

代码语言:javascript
复制
[foo, bar]

要删除大括号,请执行以下操作:

代码语言:javascript
复制
#root.![payload].toString().replaceAll('[\[\]]', '')

(只要您的JSON中没有[],示例中就是这种情况)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44483618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档