{"record":{"id":"0acd6bd2669d73a3","repo":"flowable/flowable-engine","slug":"cannot-combine-onlymessages-with-onlyexternalwor-0acd6b","errorCode":null,"errorMessage":"Cannot combine onlyMessages() with onlyExternalWorkers() in the same query","messagePattern":"Cannot combine onlyMessages\\(\\) with onlyExternalWorkers\\(\\) in the same query","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/SuspendedJobQueryImpl.java","lineNumber":477,"sourceCode":"            throw new FlowableIllegalArgumentException(\"Cannot combine onlyTimers() with onlyMessages() in the same query\");\n        }\n\n        if (onlyExternalWorkers) {\n            throw new FlowableIllegalArgumentException(\"Cannot combine onlyExternalWorkers() with onlyMessages() in the same query\");\n        }\n\n        if (inOrStatement) {\n            this.currentOrQueryObject.onlyMessages = true;\n        } else {\n            this.onlyMessages = true;\n        }\n        return this;\n    }\n\n    @Override\n    public SuspendedJobQueryImpl externalWorkers() {\n        if (onlyMessages) {\n            throw new FlowableIllegalArgumentException(\"Cannot combine onlyMessages() with onlyExternalWorkers() in the same query\");\n        }\n\n        if (onlyTimers) {\n            throw new FlowableIllegalArgumentException(\"Cannot combine onlyTimers() with onlyExternalWorkers() in the same query\");\n        }\n\n        if (inOrStatement) {\n            this.currentOrQueryObject.onlyExternalWorkers = true;\n        } else {\n            this.onlyExternalWorkers = true;\n        }\n        return this;\n    }\n\n    @Override\n    public SuspendedJobQueryImpl duedateHigherThan(Date date) {\n        if (date == null) {\n            throw new FlowableIllegalArgumentException(\"Provided date is null\");","sourceCodeStart":459,"sourceCodeEnd":495,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/SuspendedJobQueryImpl.java#L459-L495","documentation":"SuspendedJobQueryImpl.externalWorkers() throws FlowableIllegalArgumentException when onlyMessages was already set. The three job-kind filters (timers, messages, externalWorkers) are mutually exclusive; externalWorkers() after messages() fails fast with this error before the query is executed.","triggerScenarios":"Chaining .messages().externalWorkers() on the same SuspendedJobQueryImpl instance (order-independent with the other kind setters), including within or() scopes.","commonSituations":"Acquiring suspended external-worker jobs in worker-pool code that previously queried message jobs and simply appended the new filter; dynamic admin filters that allow multi-select of job kinds.","solutions":["Call at most one of messages(), timers(), externalWorkers() per query.","Run separate queries per job kind and merge results for combined views.","In multi-select UIs, enforce single-kind selection or fan out into multiple queries."],"exampleFix":"// before\njobService.createSuspendedJobQuery().messages().externalWorkers(); // throws\n// after\nList<Job> all = new ArrayList<>();\nall.addAll(jobService.createSuspendedJobQuery().messages().list());\nall.addAll(jobService.createSuspendedJobQuery().externalWorkers().list());","handlingStrategy":"type-guard","validationCode":"if (onlyMessagesAlreadyApplied) {\n    query = jobService.createSuspendedJobQuery(); // fresh query for externalWorkers()\n}","typeGuard":"boolean canApplyExternalWorkers(boolean messagesSet) { return !messagesSet; }","tryCatchPattern":"try {\n    q.messages().externalWorkers();\n} catch (FlowableIllegalArgumentException e) {\n    q = jobService.createSuspendedJobQuery().externalWorkers();\n}","preventionTips":["Apply exactly one kind filter per SuspendedJobQuery instance.","Use a builder helper that maps a single kind enum to one filter call.","Fan out multiple queries and merge lists for combined kind coverage."],"tags":["flowable","query","mutually-exclusive","job-service","external-worker"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}