INT-267: Implement Routing Slip Pattern
JIRA: https://jira.spring.io/browse/INT-267 The implementation looks like: * There is the `ROUTING_SLIP` header to keep the list of bean ids; * The `ROUTING_SLIP_INDEX` header keeps track of current `index` in the `ROUTING_SLIP` header; * `ROUTING_SLIP` List can contain channel names or bean references for the `RoutingSlip` strategy implementations. They are differentiated with `@` prefix; * The `<header-enricher>` adds `<routing-slip>` sub-element to specify the comma-delimited value for desired `ROUTING_SLIP` for the downstream flow; * The `AbstractReplyProducingMessageHandler` adds the logic to get deal with `ROUTING_SLIP` List and the algorithm is: - If `ROUTING_SLIP` isn't `null` we build `AtomicInteger` for the current `routingSlipIndex`; - the recursive `getReplyChannelFromRoutingSlip` should return a channel name or `null`; - if current `ROUTING_SLIP_INDEX` if for the `RoutingSlip` strategy, we check its result for `null` and `incrementAndGet()` the current index or not; - for the simple channel name value from `ROUTING_SLIP` list we just `incrementAndGet()` the current index and return the value; - the new `ROUTING_SLIP_INDEX` is populated to the headers of new reply message. * Polishing for `AbstractMessageSplitter` **TODO**: Docs and applying `RoutingSlip` algorithm for the `AbstractCorrelatingMessageHandler` INT-267: Move `replyProducing` logic `ARPMH` -> `AMPH` * Rework `AbstractCorrelatingMessageHandler` to use methods from super class * Rework `MessageHandlerChain.ReplyForwardingMessageChannel` to use `produceReply` * Rename `RoutingSlip` -> `RoutingSlipRouteStrategy` * Add `ExpressionEvaluationRoutingSlipRouteStrategy` Now `routingSlip` header can be configured like: ``` <routing-slip value="channel1; #{@routingSlipRoutingPojo.get(request, reply)}; @routingSlipRoutingStrategy; #{request.headers[myRoutingSlipChannel]}; channel6"/> ``` Where `;` is used as delimiter, because of `,` in the method invocation from SpEL. The simple literal (`channel1`) is just a `MessageChannel` `id`. `@` is used for `RoutingSlipRouteStrategy` bean reference. `#{...}` used for SpEL. The `HeaderEnricherParserSupport` parses this `value` to the `List<String>` - a set of bean names, where any SpEL is wrapped to the `ExpressionEvaluationRoutingSlipRouteStrategy` bean definition INT-267: Introduce `RoutingSlip` Domain class Rename `AbstractMessageProducingHandler` methods: `*reply` -> `*output` Conflicts: src/reference/docbook/whats-new.xml INT-267: Rework `RoutingSlip` -> `Map<List<String>, Integer>` Since `RoutingSlip` POJO isn't scalable in the distributed multi-language environment, it would be better to use some Java generic type for this `ROUTING_SLIP` header. The `Collections.singletonMap(Collections.unmodifiableList(routingSlipPath), 0)` is the best candidate to be convertible to other systems and allow to have thread-safety. The `ROUTING_SLIP` header is recalculated now on each `nextPath` INT-267: Introduce `RoutingSlipHeaderValueMessageProcessor` * Rework `HeaderEnricherParserSupport` logic to get rid of SpEL parsing and change `routingSlipPath` to the `ManagedList<String>` to get gain of `property-placehoder` * Add `<context:property-placeholder>` stuff to the `RoutingSlipTests` INT-267: Move inline expressions to the implicit `EERSRS` from the `RoutingSlipHeaderValueMessageProcessor` INT-267: Fix up JavaDocs and add JDBC test-case INT-267: Address PR comments INT-267: Polishing according PR comments Polishing
This commit is contained in:
committed by
Gary Russell
parent
c7286cc991
commit
fa03c6f268
@@ -63,18 +63,22 @@
|
||||
<int:reply-channel ref="quoteReplyChannel"/>
|
||||
<int:correlation-id value="123"/>
|
||||
<int:priority value="HIGHEST"/>
|
||||
<routing-slip value="channel1; routingSlipRoutingStrategy; request.headers[myRoutingSlipChannel]"/>
|
||||
<int:header name="bar" ref="someBean"/>
|
||||
</int:header-enricher>]]></programlisting>
|
||||
|
||||
<para>
|
||||
In the above configuration you can clearly see that for well-known
|
||||
headers such as <code>errorChannel</code>, <code>correlationId</code>,
|
||||
<code>priority</code>, <code>replyChannel</code>etc., instead of
|
||||
using generic <emphasis><header></emphasis> sub-elements where
|
||||
<code>priority</code>, <code>replyChannel</code>, <code>routing-slip</code> etc.,
|
||||
instead of using generic <emphasis><header></emphasis> sub-elements where
|
||||
you would have to provide both header 'name' and 'value', you can use
|
||||
convenient sub-elements to set those values directly.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Starting with <emphasis>version 4.1</emphasis> the <emphasis>Header Enricher</emphasis>
|
||||
provides <code>routing-slip</code> sub-element. See <xref linkend="routing-slip"/> for more information.
|
||||
</para>
|
||||
<para>
|
||||
<emphasis role="bold">POJO Support</emphasis>
|
||||
</para>
|
||||
|
||||
@@ -1022,5 +1022,11 @@ public List<String> route(@Header("orderStatus") OrderStatus status)]]></program
|
||||
</para>
|
||||
</note>
|
||||
</section>
|
||||
<section id="routing-slip">
|
||||
<title>Routing Slip</title>
|
||||
<para>
|
||||
TBD
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@@ -34,6 +34,13 @@
|
||||
See <xref linkend="scatter-gather"/> for more information.
|
||||
</para>
|
||||
</section>
|
||||
<section id="4.1-Routing-Slip">
|
||||
<title>Routing Slip Pattern</title>
|
||||
<para>
|
||||
The <emphasis>Routing Slip</emphasis> EIP pattern implementation is now provided.
|
||||
See <xref linkend="routing-slip"/> for more information.
|
||||
</para>
|
||||
</section>
|
||||
<section id="4.1-BoonJsonObjectMapper">
|
||||
<title>BoonJsonObjectMapper</title>
|
||||
<para>
|
||||
|
||||
Reference in New Issue
Block a user