{"record":{"id":"903eeb96fa4cf080","repo":"aeron-io/aeron","slug":"invalid-timerservicesupplier-timeserviceclassname","errorCode":null,"errorMessage":"invalid TimerServiceSupplier: <timeServiceClassName>","messagePattern":"invalid TimerServiceSupplier: <timeServiceClassName>","errorType":"validation","errorClass":"ClusterException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModule.java","lineNumber":4606,"sourceCode":"\n        private TimerServiceSupplier getTimerServiceSupplierFromSystemProperty()\n        {\n            final String timeServiceClassName = Configuration.timerServiceSupplier();\n            if (WheelTimerServiceSupplier.class.getName().equals(timeServiceClassName))\n            {\n                return new WheelTimerServiceSupplier(\n                    clusterClock.timeUnit(),\n                    0,\n                    findNextPositivePowerOfTwo(\n                        clusterClock.timeUnit().convert(wheelTickResolutionNs, TimeUnit.NANOSECONDS)),\n                    ticksPerWheel);\n            }\n            else if (PriorityHeapTimerServiceSupplier.class.getName().equals(timeServiceClassName))\n            {\n                return new PriorityHeapTimerServiceSupplier();\n            }\n\n            throw new ClusterException(\"invalid TimerServiceSupplier: \" + timeServiceClassName);\n        }\n\n        private void validateLogChannel()\n        {\n            final ChannelUri logChannelUri = parse(logChannel);\n            if (logChannelUri.containsKey(INITIAL_TERM_ID_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + INITIAL_TERM_ID_PARAM_NAME);\n            }\n            if (logChannelUri.containsKey(TERM_ID_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + TERM_ID_PARAM_NAME);\n            }\n            if (logChannelUri.containsKey(TERM_OFFSET_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + TERM_OFFSET_PARAM_NAME);\n            }\n        }","sourceCodeStart":4588,"sourceCodeEnd":4624,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModule.java#L4588-L4624","documentation":"ConsensusModule.Configuration.newTimerServiceSupplier() instantiates a TimerServiceSupplier by class name, accepting only known implementations (e.g. PriorityHeapTimerServiceSupplier). An unrecognized class name is rejected with ClusterException \"invalid TimerServiceSupplier\".","triggerScenarios":"Setting the timer service supplier property (aeron.cluster.timer.service.supplier) to a class name that is not one of the built-in suppliers and either is not on the classpath or is not a supported name.","commonSituations":"Typo in the fully-qualified class name; custom TimerServiceSupplier supplied by name without the module supporting arbitrary names; property copied from an incompatible Aeron version.","solutions":["Use the built-in name PriorityHeapTimerServiceSupplier.class.getName().","Correct the typo in the configured class name.","Remove the property to use the default timer service supplier.","If a custom supplier is required, construct it programmatically instead of by class name, or upgrade to a version supporting it."],"exampleFix":"// before\nSystem.setProperty(\"aeron.cluster.timer.service.supplier\", \"com.acme.MyTimerSupplier\");\n// after\nSystem.setProperty(\"aeron.cluster.timer.service.supplier\",\n    \"io.aeron.cluster.service.PriorityHeapTimerServiceSupplier\");","handlingStrategy":"validation","validationCode":"String name = System.getProperty(\"aeron.cluster.timer.service.supplier\", \"\");\nif (!name.isEmpty() && !\"io.aeron.cluster.service.PriorityHeapTimerServiceSupplier\".equals(name)) {\n    throw new IllegalArgumentException(\"unsupported timer service supplier: \" + name);\n}","typeGuard":null,"tryCatchPattern":"try { ConsensusModule.launch(ctx); } catch (ClusterException e) { if (e.getMessage().startsWith(\"invalid TimerServiceSupplier\")) { log.error(\"check aeron.cluster.timer.service.supplier value\"); } throw e; }","preventionTips":["Use the fully-qualified name of a built-in supplier","Remove the property to get the default","Load the class with Class.forName as a pre-flight check"],"tags":["aeron-cluster","configuration","class-name","timer-service"],"backgroundTag":"invalid-config-value","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}