{"record":{"id":"21f1381b417769b1","repo":"quarkusio/quarkus","slug":"an-event-consumer-business-method-with-two-paramet-21f138","errorCode":null,"errorMessage":"An event consumer business method with two parameters must not accept io.vertx.core.eventbus.Message or io.vertx.mutiny.core.eventbus.Message: %s [method: %s, bean:%s]","messagePattern":"An event consumer business method with two parameters must not accept io\\.vertx\\.core\\.eventbus\\.Message or io\\.vertx\\.mutiny\\.core\\.eventbus\\.Message: (.+?) \\[method: (.+?), bean:(.+?)\\]","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java","lineNumber":179,"sourceCode":"                    continue;\n                }\n                AnnotationInstance consumeEvent = annotationStore.getAnnotation(method, CONSUME_EVENT);\n                if (consumeEvent != null) {\n                    // Validate method params and return type\n                    int parametersCount = method.parametersCount();\n                    if (KotlinUtils.isKotlinSuspendMethod(method)) {\n                        parametersCount--;\n                    }\n\n                    List<Type> params = method.parameterTypes();\n                    if (parametersCount == 2) {\n                        if (!isMessageHeaders(params.get(0).name())) {\n                            // If there are two parameters, the first must be message headers.\n                            throw new IllegalStateException(String.format(\n                                    \"An event consumer business method with two parameters must have MultiMap as the first parameter: %s [method: %s, bean:%s]\",\n                                    params, method, bean));\n                        } else if (isMessage(params.get(1).name())) {\n                            throw new IllegalStateException(String.format(\n                                    \"An event consumer business method with two parameters must not accept io.vertx.core.eventbus.Message or io.vertx.mutiny.core.eventbus.Message: %s [method: %s, bean:%s]\",\n                                    params, method, bean));\n                        }\n                    } else if (parametersCount != 1) {\n                        throw new IllegalStateException(String.format(\n                                \"An event consumer business method must accept exactly one parameter: %s [method: %s, bean:%s]\",\n                                params, method, bean));\n                    }\n                    if (method.returnType().kind() != Kind.VOID && VertxConstants.isMessage(params.get(0).name())\n                            && !KotlinUtils.isKotlinSuspendMethod(method)) {\n                        throw new IllegalStateException(String.format(\n                                \"An event consumer business method that accepts io.vertx.core.eventbus.Message or io.vertx.mutiny.core.eventbus.Message must return void [method: %s, bean:%s]\",\n                                method, bean));\n                    }\n                    if (method.hasAnnotation(RunOnVirtualThread.class) && consumeEvent.value(\"ordered\") != null\n                            && consumeEvent.value(\"ordered\").asBoolean()) {\n                        throw new IllegalStateException(String.format(\n                                \"An event consumer business method that cannot use @RunOnVirtualThread and set the ordered attribute to true [method: %s, bean:%s]\",","sourceCodeStart":161,"sourceCodeEnd":197,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java#L161-L197","documentation":"Companion validation to 2508: a two-parameter @ConsumeEvent method may declare (MultiMap headers, payload) but must not also accept an eventbus Message as the second parameter, since the Message would consume the whole event leaving nothing for headers. The build fails naming the parameters, method, and bean.","triggerScenarios":"Declaring method(MultiMap headers, Message<T> msg) on a @ConsumeEvent method.","commonSituations":"Developer wants both headers and the full Message; porting code that used a single Message parameter and adding headers incorrectly.","solutions":["Use (MultiMap headers, T payload) — read payload directly, not via Message","Or keep a single Message<T> parameter and access msg.headers() inside","Split logic: a single-Message consumer that inspects headers internally"],"exampleFix":"// before\n@ConsumeEvent(\"addr\")\npublic void on(MultiMap headers, Message<String> msg) { }\n// after\n@ConsumeEvent(\"addr\")\npublic void on(MultiMap headers, String payload) { }\n// or\n@ConsumeEvent(\"addr\")\npublic void on(Message<String> msg) { /* msg.headers() */ }","handlingStrategy":"validation","validationCode":"// forbid Message as second parameter of two-param consumers\nfor (Method m : MyConsumer.class.getDeclaredMethods()) {\n    if (m.isAnnotationPresent(ConsumeEvent.class) && m.getParameterCount() == 2) {\n        Class<?> second = m.getParameterTypes()[1];\n        if (io.vertx.core.eventbus.Message.class.isAssignableFrom(second)\n            || io.vertx.mutiny.core.eventbus.Message.class.isAssignableFrom(second))\n            throw new IllegalStateException(\"Second parameter must be a payload, not Message: \" + m);\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["With MultiMap headers, use the raw payload type as second param","Use msg.headers() inside a single Message<T> consumer instead","Share a snippet/template for valid consumer signatures"],"tags":["quarkus","vertx","event-bus","method-signature","build-time"],"backgroundTag":"method-signature-invalid","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}