I went through all the Asciidoc files to correct spelling, grammar, punctuation, and usage. Wherever possible, I also made it more clear and more concise. I also added links wherever they were reasonable. Accommodating changes that came while I was editing Various folks made changes (one of which I recommended) to the documents while I spent a month editing. I had to edit that new and changed content as well, so I need this second commit. Accommodating Artem's requested changes for `aggregator.adoc` Artem reviewed `aggregator.adoc` as a starting point, so that he could get some questions answered. I have made the changes he requested (and answered his questions on Github).
128 lines
4.3 KiB
Plaintext
128 lines
4.3 KiB
Plaintext
[[bridge]]
|
|
=== Messaging Bridge
|
|
|
|
A messaging bridge is a relatively trivial endpoint that connects two message channels or channel adapters.
|
|
For example, you may want to connect a `PollableChannel` to a `SubscribableChannel` so that the subscribing endpoints do not have to worry about any polling configuration.
|
|
Instead, the messaging bridge provides the polling configuration.
|
|
|
|
By providing an intermediary poller between two channels, you can use a messaging bridge to throttle inbound messages.
|
|
The poller's trigger determines the rate at which messages arrive on the second channel, and the poller's `maxMessagesPerPoll` property enforces a limit on the throughput.
|
|
|
|
Another valid use for a messaging bridge is to connect two different systems.
|
|
In such a scenario, Spring Integration's role is limited to making the connection between these systems and managing a poller, if necessary.
|
|
It is probably more common to have at least a transformer between the two systems, to translate between their formats.
|
|
In that case, the channels can be provided as the 'input-channel' and 'output-channel' of a transformer endpoint.
|
|
If data format translation is not required, the messaging bridge may indeed be sufficient.
|
|
|
|
[[bridge-namespace]]
|
|
==== Configuring a Bridge with XML
|
|
|
|
You can use the `<bridge>` element is used to create a messaging bridge between two message channels or channel adapters.
|
|
To do so, provide the `input-channel` and `output-channel` attributes, as the following example shows:
|
|
|
|
====
|
|
[source,xml]
|
|
----
|
|
<int:bridge input-channel="input" output-channel="output"/>
|
|
----
|
|
====
|
|
|
|
As mentioned above, a common use case for the messaging bridge is to connect a `PollableChannel` to a `SubscribableChannel`.
|
|
When performing this role, the messaging bridge may also serve as a throttler:
|
|
|
|
====
|
|
[source,xml]
|
|
----
|
|
<int:bridge input-channel="pollable" output-channel="subscribable">
|
|
<int:poller max-messages-per-poll="10" fixed-rate="5000"/>
|
|
</int:bridge>
|
|
----
|
|
====
|
|
|
|
You can use a similar mechanism to connecting channel adapters.
|
|
The following example shows a simple "`echo`" between the `stdin` and `stdout` adapters from Spring Integration's `stream` namespace:
|
|
|
|
====
|
|
[source,xml]
|
|
----
|
|
<int-stream:stdin-channel-adapter id="stdin"/>
|
|
|
|
<int-stream:stdout-channel-adapter id="stdout"/>
|
|
|
|
<int:bridge id="echo" input-channel="stdin" output-channel="stdout"/>
|
|
----
|
|
====
|
|
|
|
Similar configurations work for other (potentially more useful) Channel Adapter bridges, such as file-to-JMS or mail-to-file.
|
|
Upcoming chapters cover the various channel adapters.
|
|
|
|
NOTE: If no 'output-channel' is defined on a bridge, the reply channel provided by the inbound message is used, if available.
|
|
If neither an output nor a reply channel is available, an exception is thrown.
|
|
|
|
[[bridge-annot]]
|
|
==== Configuring a Bridge with Java Configuration
|
|
|
|
The following example shows how to configure a bridge in Java by using the `@BridgeFrom` annotation:
|
|
|
|
====
|
|
[source, java]
|
|
----
|
|
@Bean
|
|
public PollableChannel polled() {
|
|
return new QueueChannel();
|
|
}
|
|
|
|
@Bean
|
|
@BridgeFrom(value = "polled", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
|
|
public SubscribableChannel direct() {
|
|
return new DirectChannel();
|
|
}
|
|
----
|
|
====
|
|
|
|
The following example shows how to configure a bridge in Java by using the `@BridgeTo` annotation:
|
|
|
|
[source, java]
|
|
----
|
|
@Bean
|
|
@BridgeTo(value = "direct", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "10"))
|
|
public PollableChannel polled() {
|
|
return new QueueChannel();
|
|
}
|
|
|
|
@Bean
|
|
public SubscribableChannel direct() {
|
|
return new DirectChannel();
|
|
}
|
|
----
|
|
|
|
Alternately, you can use a `BridgeHandler`, as the following example shows:
|
|
|
|
[source, java]
|
|
----
|
|
@Bean
|
|
@ServiceActivator(inputChannel = "polled",
|
|
poller = @Poller(fixedRate = "5000", maxMessagesPerPoll = "10"))
|
|
public BridgeHandler bridge() {
|
|
BridgeHandler bridge = new BridgeHandler();
|
|
bridge.setOutputChannelName("direct");
|
|
return bridge;
|
|
}
|
|
----
|
|
|
|
[[bridge-dsl]]
|
|
==== Configuring a Bridge with the Java DSL
|
|
|
|
You can use the Java Domain Specific Language (DSL) to configure a bridge, as the following example shows:
|
|
|
|
[source, java]
|
|
----
|
|
@Bean
|
|
public IntegrationFlow bridgeFlow() {
|
|
return IntegrationFlows.from("polled")
|
|
.bridge(e -> e.poller(Pollers.fixedDelay(5000).maxMessagesPerPoll(10)))
|
|
.channel("direct")
|
|
.get();
|
|
}
|
|
----
|