Polishing routing documentation

This commit is contained in:
Oleg Zhurakousky
2019-10-31 14:55:51 +01:00
parent 6c6d41c8ca
commit b8de26b4f7

View File

@@ -1161,11 +1161,14 @@ Routing can be achieved by relying on `RoutingFunction` available in Spring Clou
Once enabled `RoutingFunction` will be bound to input destination
receiving all the messages and route them to other functions based on the provided instruction.
IMPORTANT: For the purposes of binding the name of the routing destination is `functionRouter-in-0`
(see RoutingFunction.FUNCTION_NAME and binding naming convention <<Functional binding names>>).
Instruction could be provided with individual messages as well as application properties.
Here are couple of samples:
***Using message headers***
===== Using message headers
[source,java]
----
@SpringBootApplication
@@ -1191,20 +1194,42 @@ public class SampleApplication {
}
}
----
By default `RoutingFunction` will look for `spring.cloud.function.definition` header and if it is found its value will be treated as routing instruction.
So in the above case the value of such header should be either `odd` or `even` (the name of the function beans) to route request to available functions.
By sending message to the `functionRouter-in-0` destination exposed by the binder (i.e., rabbit, kafka),
such message will be routed to the appropriate (even or odd) Consumer.
By default `RoutingFunction` will look for `spring.cloud.function.definition` or `spring.cloud.function.routing-expression` (for more dynamic scenarios with SpEL)
header and if it is found its value will be treated as routing instruction.
You can also use SpEL for more dynamic scenarios via `spring.cloud.function.routing-expression` header.
For example,
setting `spring.cloud.function.routing-expression` header to value `T(java.lang.System).currentTimeMillis() % 2 == 0 ? 'even' : 'odd'` will end up semi-randomly routing request to either `odd` or `even` functions.
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']`
***Using application properties***
===== Using application properties
The `spring.cloud.function.routing-expression` and/or `spring.cloud.function.definition`
can be passed as application properties (e.g., `spring.cloud.function.routing-expression=headers['type']`.
[source,java]
----
@SpringBootApplication
public class RoutingStreamApplication {
Passing instructions via application properties is especially important for reactive functions since given that fact that reactive
public static void main(String[] args) {
SpringApplication.run(RoutingStreamApplication.class,
"--spring.cloud.function.routing-expression="
+ "T(java.lang.System).nanoTime() % 2 == 0 ? 'even' : 'odd'");
}
@Bean
public Consumer<Integer> even() {
return value -> System.out.println("EVEN: " + value);
}
@Bean
public Consumer<Integer> odd() {
return value -> System.out.println("ODD: " + value);
}
}
----
IMPORTANT: Passing instructions via application properties is especially important for reactive functions since given that reactive
function is only invoked once to pass the Publisher, so access to the individual items is limited.
==== Routing FROM Consumer
@@ -1213,7 +1238,7 @@ Aside from static destinations, Spring Cloud Stream lets applications send messa
This is useful, for example, when the target destination needs to be determined at runtime.
Applications can do so in one of two ways
***BinderAwareChannelResolver***
===== BinderAwareChannelResolver
The `BinderAwareChannelResolver` is a special bean registered automatically by the framework.
You can autowire this bean into your application and use it to resolve output destination at runtime
@@ -1251,7 +1276,7 @@ curl -H "Content-Type: application/json" -X POST -d "order-1" http://localhost:8
The destinations, 'customers' and 'orders', are created in the broker (in the exchange for Rabbit or in the topic for Kafka)
with names of 'customers' and 'orders', and the data is published to the appropriate destinations.
***spring.cloud.stream.sendto.destination***
===== spring.cloud.stream.sendto.destination
You can also delegate to the framework to dynamically resolve the output destination by specifying `spring.cloud.stream.sendto.destination` header
set to the name of the destination to be resolved.