Spring Cloud Function - отдельное выражение маршрутизации для разных потребителей - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть служба, которая получает разные структурированные сообщения из разных очередей сообщений. Имея @StreamListener conditions, мы можем выбрать для каждого типа сообщения, как это сообщение должно обрабатываться. В качестве примера:

Мы получаем два разных типа сообщений, которые имеют разные поля заголовка и значения, например,

Входящие из очереди "order":

Order1: { Header: {catalog:groceries} }
Order2: { Header: {catalog:tools} }

Входящие из очередь «отгрузки»:

Shipment1: { Header: {region:Europe} }
Shipment2: { Header: {region:America} }

Для каждой очереди существует привязка, и в соответствии с @StreamListener я могу обрабатывать сообщения по каталогам и регионам по-разному

например

@StreamListener(target = OrderSink.ORDER_CHANNEL, condition = "headers['catalog'] == 'groceries'")
public void onGroceriesOrder(GroceryOder order){
...
}

Итак, вопрос , как этого добиться с помощью нового подхода Spring Cloud Function?

В документации https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.2.RELEASE/reference/html/spring-cloud-stream.html#_event_routing упоминается:

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

Можно ли добавить выражение маршрутизации в привязку, как (в application.yml)

onGroceriesOrder-in-0:
  destination: order
  routing-expression: "headers['catalog']==groceries"

?

РЕДАКТИРОВАТЬ после первого ответа Если приведенное выше выражение в этом месте невозможно, что подразумевает первый ответ, чем мой вопрос звучит так:

Насколько я понимаю, выражение типа routing-expression: headers['catalog'] должно быть установлено глобально, потому что результат отображается на определенные (потребительские) функции.

Как я могу контролировать что 2 разных сообщения в каждой очереди будут перенаправлены в их собственную функцию потребителя, например,

Order1 --> MyOrderService.onGroceriesOrder()
Order2 --> MyOrderService.onToolsOrder()
Shipment1 --> MyShipmentService.onEuropeShipment()
Shipment2 --> MyShipmentService.onAmericaShipment()

Это было легко с @StreamListener, потому что каждый метод получает свою собственную аннотацию @StreamListener с различными условиями. Как этого добиться с помощью новой настройки routing-expression?

1 Ответ

0 голосов
/ 10 апреля 2020

Помимо того факта, что вышеупомянутое не является допустимым выражением, но я думаю, что вы имели в виду headers['catalog']==groceries. Если это так, что вы ожидаете от оценки, так как единственными двумя вариантами могут быть истина / ложь. В любом случае, они риторические, но помогают понять проблему и как ее исправить.

Выражение должно приводить к значению функции для маршрутизации TO. Так. , .

routing-expression: headers['catalog'] - предполагается, что фактическим значением заголовка catalog является имя вызываемой функции

routing-expression: headers['catalog']==groceries ? 'processGroceries' : 'processOther' - отображает значение 'бакалеи' в функцию 'processGroceries'.

...