A channel is a named virtual address for passing messages between application components. In MicroProfile Reactive Messaging, CDI bean methods produce, consume, or process messages through channels. Connectors can attach external services to the same messaging model, so communication need not stay inside one application. section 9.3 section 9.3.2
Use @Outgoing("name") on a producer and @Incoming("name") on a consumer. A processor has both annotations: it reads from one channel and writes to another. Each channel has one source and one sink; unique channel names between processors establish their order. Reactive Streams provides the flow model, while SmallRye Reactive Messaging controls the flow in Quarkus. section 9.3.2 section 9.10
A two-channel pipeline
A producer emits ticks on "ticks". A processor receives them from "ticks", transforms them into timestamp strings, and emits those on "times". A consumer reads "times" and prints each string. The channel names connect the methods even when the methods reside in different CDI beans. section 9.3.2
Channels also bridge code and services outside a method-to-method pipeline:
- Inject @Channel("requests") with an Emitter to send from imperative code. Its send operation returns a CompletionStage that completes on acknowledgment or exceptionally on negative acknowledgment; an unacknowledged message leaves it incomplete. section 9.3.4
- Inject @Channel("ticks") as a Multi to expose produced events through a server-sent events endpoint. section 9.3.4
- Add a connector extension to route a channel through a broker. With quarkus-messaging-rabbitmq as the only connector, the outgoing "invoices" channel is automatically mapped to a RabbitMQ exchange; the receiving side uses an incoming channel configured for the broker queue and exchange. section 9.7
An asynchronous channel can buffer messages while a receiving service is unavailable, allowing the sender to continue rather than wait for a synchronous response. That resilience depends on the channel and its delivery behavior; a virtual channel name alone is not a buffering guarantee. For reactive-messaging CDI beans, use the supported @ApplicationScoped or @Dependent scopes. section 9.3.1 section 9.3.2









