{"record":{"id":"5272c795c2ac3417","repo":"quarkusio/quarkus","slug":"the-execution-model-s-of-s-is-not-supported","errorCode":null,"errorMessage":"The execution model %s of %s is not supported","messagePattern":"The execution model (.+?) of (.+?) is not supported","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/signals/runtime/src/main/java/io/quarkus/signals/runtime/impl/DefaultBlockingReceiverExecutor.java","lineNumber":40,"sourceCode":"\n    private final ConcurrencyLimiter blockingLimiter;\n\n    DefaultBlockingReceiverExecutor(ExecutorService executorService, SignalsRuntimeConfig config) {\n        this.executorService = executorService;\n        int limit = config.receivers().blockingConcurrencyLimit().orElse(-1);\n        this.blockingLimiter = limit > 0 ? new ConcurrencyLimiter(limit) : null;\n    }\n\n    @Override\n    public boolean supportsExecutionModel(ExecutionModel val) {\n        return val == ExecutionModel.BLOCKING;\n    }\n\n    @Override\n    public <SIGNAL, RESPONSE> Uni<RESPONSE> execute(Receiver<SIGNAL, RESPONSE> receiver, SignalContext<SIGNAL> context) {\n        ExecutionModel executionModel = receiver.executionModel();\n        if (!supportsExecutionModel(executionModel)) {\n            throw new IllegalStateException(\n                    \"The execution model %s of %s is not supported\".formatted(executionModel, receiver));\n        }\n        LOG.debugf(\"Notify %s [signal=%s, emission=%s]\", receiver, context.signalType(),\n                context.emissionType());\n        CompletableFuture<RESPONSE> ret = execute(executionModel, new Callable<Uni<RESPONSE>>() {\n            @Override\n            public Uni<RESPONSE> call() throws Exception {\n                return receiver.notify(context);\n            }\n        });\n        return Uni.createFrom().completionStage(ret);\n    }\n\n    protected <RESULT> CompletableFuture<RESULT> execute(ExecutionModel executionModel, Callable<Uni<RESULT>> action) {\n        CompletableFuture<RESULT> ret = new CompletableFuture<>();\n        ConcurrencyLimiter limiter = blockingLimiter;\n        if (limiter != null) {\n            limiter.run(new Runnable() {","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/signals/runtime/src/main/java/io/quarkus/signals/runtime/impl/DefaultBlockingReceiverExecutor.java#L22-L58","documentation":"DefaultBlockingReceiverExecutor only runs receivers whose execution model it supports (blocking models). At runtime, execute() checks the receiver's execution model and throws IllegalStateException if it cannot run it — the build-time check (error 2111) was bypassed, e.g. by a custom Receiver registered programmatically.","triggerScenarios":"Calling execute() on a receiver whose Receiver.executionModel() is a non-blocking/reactive model while using DefaultBlockingReceiverExecutor, typically via a programmatically registered receiver.","commonSituations":"Registering a custom receiver through Receivers API with an async signature but the default (blocking) executor selected, or config switching executors after receivers were written reactively.","solutions":["Change the receiver to a blocking signature/model supported by the default executor.","Register/configure an executor implementation that supports the receiver's execution model.","Verify custom receivers are validated with supportsExecutionModel() before wiring them."],"exampleFix":"// before\nreceivers.register(new Receiver<>() {\n  public Uni<Response> onSignal(Signal s) { ... }\n});\n\n// after (blocking executor)\nreceivers.register(new Receiver<>() {\n  public Response onSignal(Signal s) { ... }\n});","handlingStrategy":"try-catch","validationCode":"// Before wiring a custom receiver:\nif (!executor.supportsExecutionModel(receiver.executionModel())) { throw new IllegalArgumentException(\"executor cannot run \" + receiver); }","typeGuard":null,"tryCatchPattern":"try {\n    executor.execute(receiver, ctx).await().indefinitely();\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"execution model\")) { log.fatal(\"receiver executor/model mismatch\"); throw e; }\n    throw e;\n}","preventionTips":["Keep custom receivers blocking when using DefaultBlockingReceiverExecutor.","Call supportsExecutionModel() when registering receivers programmatically.","Avoid mixing reactive receiver signatures with blocking executors."],"tags":["runtime","execution-model","signals","quarkus"],"backgroundTag":"unsupported-execution-model","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}