Spring Cloud Function - 不同消费者的单独路由表达式

Dan*_*nny 7 spring spring-cloud-stream spring-cloud-function

我有一个服务,它从不同的消息队列接收不同的结构化消息。我们可以针对@StreamListener conditions每种消息类型选择如何处理该消息。举个例子:

\n\n

我们收到两种不同类型的消息,它们具有不同的标头字段和值,例如

\n\n

来自“订单”队列的传入:

\n\n
Order1: { Header: {catalog:groceries} }\nOrder2: { Header: {catalog:tools} }\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自“发货”队列的传入:

\n\n
Shipment1: { Header: {region:Europe} }\nShipment2: { Header: {region:America} }\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个队列都有一个绑定,根据该绑定,@StreamListener我可以按目录和区域以不同的方式处理消息

\n\n

例如

\n\n
@StreamListener(target = OrderSink.ORDER_CHANNEL, condition = "headers[\'catalog\'] == \'groceries\'")\npublic void onGroceriesOrder(GroceryOder order){\n...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么问题是,如何使用新的 Spring Cloud Function 方法来实现这一点?

\n\n

在文档https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.2.RELEASE/reference/html/spring-cloud-stream.html#_event_routing中提到:

\n\n

Also, for SpEL, the root object of the evaluation context is Message so you can do evaluation on individual headers (or message) as well \xe2\x80\xa6\xe2\x80\x8b.routing-expression=headers[\'type\']

\n\n

是否可以将路由表达式添加到绑定中,例如(在application.yml

\n\n
onGroceriesOrder-in-0:\n  destination: order\n  routing-expression: "headers[\'catalog\']==groceries"\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

第一个答案后编辑\n如果此位置的上述表达式不可能,那么第一个答案意味着什么,那么我的问题如下:

\n\n

据我了解,routing-expression: headers[\'catalog\']必须全局设置类似的表达式,因为结果映射到某些(消费者)函数。

\n\n

我如何控制每个队列上的 2 个不同消息将转发到它们自己的消费者函数,例如

\n\n
Order1 --> MyOrderService.onGroceriesOrder()\nOrder2 --> MyOrderService.onToolsOrder()\nShipment1 --> MyShipmentService.onEuropeShipment()\nShipment2 --> MyShipmentService.onAmericaShipment()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这对于 来说很容易@StreamListener,因为每个方法都会在不同的条件下获得自己的@StreamListener注释。如何使用新routing-expression设置来实现这一点?\n?

\n

Ole*_*sky 3

除了以上不是有效的表达之外,但我认为您的意思是headers['catalog']==groceries. 如果是这样,您期望通过评估它会发生什么,因为唯一的两个选项可能是真/假。无论如何,这些都是修辞性的,但有助于理解问题以及如何解决它。

该表达式必须产生要路由至的函数值。所以。。。

routing-expression: headers['catalog']- 假设catalogheader 的实际值是要调用的函数的名称

routing-expression: headers['catalog']==groceries ? 'processGroceries' : 'processOther'- 将值“groceries”映射到“processGroceries”函数。