Interface QueryBus
- All Superinterfaces:
DescribableComponent,QueryHandlerRegistry<QueryBus>
- All Known Implementing Classes:
DistributedQueryBus,InterceptingQueryBus,SimpleQueryBus
queries to their appropriate query handler.
Query handlers can subscribe to the query bus to handle queries
matching the QualifiedName.
Hence, queries dispatched (through either query(QueryMessage, ProcessingContext),
query(QueryMessage, ProcessingContext), and
subscriptionQuery(QueryMessage, ProcessingContext, int)) match a subscribed query handler based
on "query name".
There may be multiple handlers for each query.
- Since:
- 3.1
- Author:
- Marc Gathier, Allard Buijze
-
Method Summary
Modifier and TypeMethodDescriptioncompleteSubscriptions(Predicate<QueryMessage> filter, ProcessingContext context) Completessubscription queriesmatching the givenfilter.completeSubscriptionsExceptionally(Predicate<QueryMessage> filter, Throwable cause, ProcessingContext context) emitUpdate(Predicate<QueryMessage> filter, Supplier<SubscriptionQueryUpdateMessage> updateSupplier, ProcessingContext context) Emits the outcome of theupdateSuppliertosubscription queriesmatching the givenqueryNameand givenfilter.query(QueryMessage query, ProcessingContext context) Dispatch the givenqueryto aQueryHandlersubscribedto the givenquery'squery name, returning aMessageStreamofresponsesto the givenquery.subscribeToUpdates(QueryMessage query, int updateBufferSize) Subscribes the givenquerywith the givenupdateBufferSize, and returns the MessageStream that provides the update of the subscription query.subscriptionQuery(QueryMessage query, ProcessingContext context, int updateBufferSize) Dispatch the givenqueryto a single QueryHandler subscribed to the givenquery's queryName/initialResponseType/updateResponseType.Methods inherited from interface org.axonframework.common.infra.DescribableComponent
describeToMethods inherited from interface org.axonframework.messaging.queryhandling.QueryHandlerRegistry
subscribe, subscribe, subscribe
-
Method Details
-
query
@Nonnull MessageStream<QueryResponseMessage> query(@Nonnull QueryMessage query, @Nullable ProcessingContext context) Dispatch the givenqueryto aQueryHandlersubscribedto the givenquery'squery name, returning aMessageStreamofresponsesto the givenquery.The resulting
MessageStreamwill contain 0, 1, or NQueryResponseMessages, depending on theQueryHandlerthat handled the givenquery.As several
QueryHandlerscan be registered for the same query name, this method will loop through them (in insert order) until one has a suitable return value. A suitable response is any value or user exception returned from aQueryHandler. When no handlers are available that can answer the givenquery, the returnedMessageStreamwill havefailedwith aNoHandlerForQueryException.- Parameters:
query- The query to dispatch.context- The processing context under which the query is being published (can benull).- Returns:
- A
MessageStreamcontaining either 0, 1, or NQueryResponseMessages. - Throws:
NoHandlerForQueryException- When noQueryHandleris registered for the givenquery'squery name.
-
subscriptionQuery
@Nonnull MessageStream<QueryResponseMessage> subscriptionQuery(@Nonnull QueryMessage query, @Nullable ProcessingContext context, int updateBufferSize) Dispatch the givenqueryto a single QueryHandler subscribed to the givenquery's queryName/initialResponseType/updateResponseType. The result is lazily created and there will be no execution of the query handler before there is a subscription to the initial result. In order not to miss update, the query bus will queue all update which happen after the subscription query is done and once the subscription to the flux is made, these update will be emitted.If there is an error during retrieving or consuming initial result, stream for incremental update is NOT interrupted.
If there is an error during emitting an update, subscription is cancelled causing further emits not reaching the destination.
If a subscription query with the same
queryidentifier is already registered, the returnedMessageStreamwill befailedwith aSubscriptionQueryAlreadyRegisteredExceptioninstead of throwing the exception. This allows callers to handle double subscription scenarios gracefully through the stream API.- Parameters:
query- The subscription query to dispatch.context- The processing context under which the query is being published (can benull).updateBufferSize- The size of the buffer which accumulates update.- Returns:
- query result containing initial result and incremental update, or a failed
MessageStreamwithSubscriptionQueryAlreadyRegisteredExceptionif a subscription with the same query identifier already exists.
-
subscribeToUpdates
@Nonnull MessageStream<SubscriptionQueryUpdateMessage> subscribeToUpdates(@Nonnull QueryMessage query, int updateBufferSize) Subscribes the givenquerywith the givenupdateBufferSize, and returns the MessageStream that provides the update of the subscription query.Can be used directly instead when fine-grained control of update handlers is required. If using the update directly is not mandatory for your use case, we strongly recommend using
subscriptionQuery(QueryMessage, ProcessingContext, int)instead.Note that the returned MessageStream must be consumed from before the buffer fills up. Once the buffer is full, any attempt to add an update will complete the stream with an exception.
If a subscription query with the same
queryidentifier is already registered, the returnedMessageStreamwill befailedwith aSubscriptionQueryAlreadyRegisteredExceptioninstead of throwing the exception.- Parameters:
query- The subscription query for which we register an update handler.updateBufferSize- The size of the buffer that accumulates update.- Returns:
- a MessageStream of update for the given subscription query, or a failed
MessageStreamwithSubscriptionQueryAlreadyRegisteredExceptionif a subscription with the same query identifier already exists.
-
emitUpdate
@Nonnull CompletableFuture<Void> emitUpdate(@Nonnull Predicate<QueryMessage> filter, @Nonnull Supplier<SubscriptionQueryUpdateMessage> updateSupplier, @Nullable ProcessingContext context) Emits the outcome of theupdateSuppliertosubscription queriesmatching the givenqueryNameand givenfilter.- Parameters:
filter- A predicate filtering onQueryMessages. TheupdateSupplierwill only be sent to subscription queries matching this filter.updateSupplier- The update supplier to emit forsubscription queriesmatching the givenfilter.context- The processing context under which the updateSupplier is being emitted (can benull).- Returns:
- A future completing whenever the updateSupplier has been emitted.
-
completeSubscriptions
@Nonnull CompletableFuture<Void> completeSubscriptions(@Nonnull Predicate<QueryMessage> filter, @Nullable ProcessingContext context) Completessubscription queriesmatching the givenfilter.To be used whenever there are no subsequent update to
emitleft.- Parameters:
filter- A predicate filtering onQueryMessages. Subscription queries matching this filter will be completed.context- The processing context within which to complete subscription queries (can benull).- Returns:
- A future completing whenever all matching
subscription querieshave been completed.
-
completeSubscriptionsExceptionally
@Nonnull CompletableFuture<Void> completeSubscriptionsExceptionally(@Nonnull Predicate<QueryMessage> filter, @Nonnull Throwable cause, @Nullable ProcessingContext context) Completessubscription queriesmatching the givenfilterexceptionally with the givencause.To be used whenever
emitting updateshould be stopped due to some exception.- Parameters:
filter- A predicate filtering onQueryMessages. Subscription queries matching this filter will be completed exceptionally.cause- the cause of an errorcontext- The processing context within which to complete subscription queries exceptionally (can benull).- Returns:
- A future completing whenever all matching
subscription querieshave been completed exceptionally.
-