Skip to content

Skipping messages

Sometimes you receive a message and don’t want to produce an output message. To handle this, you have several choices:

  1. for method processing single message or payload, producing null would produce an ignored message (not forwarded)
  2. for method processing streams, you can generate an empty stream.

Skipping a single item

To skip a single message or payload, return null:

// Skip when processing payload synchronously - returning `null`
@Incoming("in")
@Outgoing("out")
public String processPayload(String s) {
    if (s.equalsIgnoreCase("skip")) {
        return null;
    }
    return s.toUpperCase();
}

// Skip when processing message synchronously - returning `null`
@Incoming("in")
@Outgoing("out")
public Message<String> processMessage(Message<String> m) {
    String s = m.getPayload();
    if (s.equalsIgnoreCase("skip")) {
        m.ack();
        return null;
    }
    return m.withPayload(s.toUpperCase());
}

// Skip when processing payload asynchronously - returning a `Uni` with a `null` value
@Incoming("in")
@Outgoing("out")
public Uni<String> processPayloadAsync(String s) {
    if (s.equalsIgnoreCase("skip")) {
        // Important, you must not return `null`, but a `null` content
        return Uni.createFrom().nullItem();
    }
    return Uni.createFrom().item(s.toUpperCase());
}

// Skip when processing message asynchronously - returning a `Uni` with a `null` value
@Incoming("in")
@Outgoing("out")
public Uni<Message<String>> processMessageAsync(Message<String> m) {
    String s = m.getPayload();
    if (s.equalsIgnoreCase("skip")) {
        m.ack();
        return Uni.createFrom().nullItem();
    }
    return Uni.createFrom().item(m.withPayload(s.toUpperCase()));
}

Skipping in a stream

To skip a message or payload when manipulating a stream, emit an empty Multi (or Publisher):

@Incoming("in")
@Outgoing("out-1")
public Multi<String> processPayload(String s) {
    if (s.equalsIgnoreCase("skip")) {
        return Multi.createFrom().empty();
    }
    return Multi.createFrom().item(s.toUpperCase());
}

@Incoming("in")
@Outgoing("out-2")
public Multi<Message<String>> processMessage(Message<String> m) {
    String s = m.getPayload();
    if (s.equalsIgnoreCase("skip")) {
        return Multi.createFrom().empty();
    }
    return Multi.createFrom().item(m.withPayload(s.toUpperCase()));
}

@Incoming("in")
@Outgoing("out-3")
public Multi<String> processPayloadStream(Multi<String> stream) {
    return stream
            .select().where(s -> !s.equalsIgnoreCase("skip"))
            .onItem().transform(String::toUpperCase);
}

@Incoming("in")
@Outgoing("out-4")
public Multi<Message<String>> processMessageStream(Multi<Message<String>> stream) {
    return stream
            .select().where(m -> !m.getPayload().equalsIgnoreCase("skip"))
            .onItem().transform(m -> m.withPayload(m.getPayload().toUpperCase()));
}