@Merge is an experimental feature.

By default, messages transiting in a channel can arise from a single producer. Having multiple producers is considered erroneous and is reported at deployment time.

The Merge annotation changes this behavior and indicates that a channel can have multiple producers. @Merge must be used with the @Incoming annotation:

public int increment(int i) {
    return i + 1;

public int multiply(int i) {
    return i * 2;

public void getAll(int i) {

In the previous example, the consumer gets all the messages (from both producers).

The @Merge annotation allows configuring how the incoming messages (from the different producers) are merged into the channel. The mode attribute allows configuring this behavior:

  • ONE picks a single producer, discarding the other producer;

  • MERGE (default) gets all the messages as they come, without any defined order. Messages from different producers may be interleaved.

  • CONCAT concatenates the producers. The messages from one producer are received until the messages from other producers are received.

Outbound connectors also support a merge attribute that allows consuming the messages to multiple upstreams. It will dispatch all the received messages.