adam bien's blog

Emitting JAX-RS Messages into MicroProfile Reactive Messaging Channels 📎

Reactive Messaging for MicroProfile API allows mapping of method's parameters and return values to virtual channels:

import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;

public class HelloListener {

    @Incoming("hello")
    @Outgoing("confirmed")
    public String onHello(String hello) {
        return "confirmed: " + hello;
    }
}    

Messages consumed by Jakarta RESTful Web Services / Java API for RESTful Web Services can be ingested into the system with the injected Emitter qualified with the @Channel annotation.

After sending the String to the Emitter, the message becomes available in the channel and can be consumed as method parameter or sent to Kafka topic:


import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.reactive.messaging.Channel;
import org.eclipse.microprofile.reactive.messaging.Emitter;

@Path("/hello")
public class HelloResource {

    @Inject
    @Channel("hello")
    Emitter<String> emitter;

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    public void forward(String message) {
        emitter.send(message);
    }
}    

See it in action, and from scratch in 7 minutes: