quarkusio/quarkus · error · IllegalStateException
%s execution model is not supported: %s
Error message
%s execution model is not supported: %s
What it means
Each signal receiver implementation only supports certain CDI execution models (e.g. blocking, non-blocking event loop). During build, the processor computes the method's execution model and rejects it if the configured receiver executor implementation cannot run that model.
Source
Thrown at extensions/signals/deployment/src/main/java/io/quarkus/signals/deployment/SignalsProcessor.java:158
}
}
}
if (!seenMethods.add(method.signatureKey())) {
// Overridden by a subclass
continue;
}
if (signalParam != null) {
if (Modifier.isPrivate(method.flags())) {
throw new IllegalStateException(
"A receiver method must not be private: " + methodDesc(method));
}
if (Modifier.isStatic(method.flags())) {
throw new IllegalStateException(
"A receiver method must not be static: " + methodDesc(method));
}
ExecutionModel executionModel = getExecutionModel(method);
if (!receiverExecutorImplementation.isSupported(executionModel)) {
throw new IllegalStateException(
"%s execution model is not supported: %s".formatted(executionModel, methodDesc(method)));
}
InvokerBuilder invokerBuilder = invokerFactory.createInvoker(bean, method)
.withInstanceLookup();
if (params.size() > 1) {
for (MethodParameterInfo param : params) {
if (param != signalParam) {
invokerBuilder.withArgumentLookup(param.position());
}
}
}
List<AnnotationInstance> qualifiers = new ArrayList<>();
for (AnnotationInstance a : signalParam.declaredAnnotations()) {
if (knownQualifiers.contains(a.name())) {
qualifiers.add(a);
}
}
receivers.produce(View on GitHub (pinned to e1c734241f)
Solutions
- Change the receiver method to match the supported execution model (e.g. make it a plain blocking method, or add/remove @Blocking).
- Configure/select a receiver executor implementation that supports the method's execution model.
- Change the return type (e.g. void instead of Uni<...>) if reactive return is the problem.
Example fix
// before
@SignalReceiver
Uni<Void> onSig(SignalEvent evt) { ... }
// after (blocking executor)
@SignalReceiver
void onSig(SignalEvent evt) { ... } Defensive patterns
Strategy: validation
Validate before calling
// Before registering, check the executor supports the model:
ExecutionModel model = getExecutionModel(method);
if (!executor.supports(model)) throw new IllegalArgumentException("unsupported execution model: " + model); Prevention
- Match receiver return types (void vs Uni/CompletionStage) to the configured executor.
- Annotate receivers explicitly with @Blocking/@NonBlocking to make the model unambiguous.
- Rebuild after changing executor configuration so build-time checks run.
When it happens
Trigger: A receiver method whose execution model (determined from annotations like @Blocking/@NonBlocking/@RunOnVirtualThread and return type) is unsupported by the selected receiverExecutorImplementation — e.g. an async/Uni-returning method on an executor that only supports blocking methods.
Common situations: Mixing reactive receiver signatures with a blocking executor implementation, or returning Uni/CompletionStage from a receiver when the runtime executor does not support reactive execution.
Related errors
- A receiver method must have exactly one parameter annotated
- A receiver method must not be private:
- A receiver method must not be static:
- The execution model %s of %s is not supported
- Failed to open path tree with root %s
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/21c0a7acbd7b3c52.
Report an issue: GitHub.