{"record":{"id":"79a02f97af5b857d","repo":"HangfireIO/Hangfire","slug":"server-context-serverid-can-t-process-recurrin","errorCode":null,"errorMessage":"Server '{context.ServerId}' can't process recurring job '{recurringJobId}' of version '{recurringJob.Version ?? 1}'. Max supported version of this server is '{MaxSupportedVersion}'.","messagePattern":"Server '(.+?)' can't process recurring job '(.+?)' of version '(.+?)'\\. Max supported version of this server is '(.+?)'\\.","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"warning","filePath":"src/Hangfire.Core/Server/RecurringJobScheduler.cs","lineNumber":319,"sourceCode":"            string recurringJobId, RecurringJobEntity recurringJob, DateTime now)\n        {\n            // We always start a transaction, regardless our recurring job was updated or not,\n            // to prevent from infinite loop, when there's an old processing server (pre-1.7.0)\n            // in our environment that doesn't know it should modify the score for entries in\n            // the recurring jobs set.\n            using (var transaction = connection.CreateWriteTransaction())\n            {\n                Exception exception = null;\n                \n                try\n                {\n                    // We can't handle recurring job with unsupported versions - there may be additional\n                    // features. we don't know about. We also shouldn't stop the whole scheduler as\n                    // there may be jobs with lower versions. Instead, we'll re-schedule such a job and\n                    // emit a warning message to the log.\n                    if (recurringJob.Version.HasValue && recurringJob.Version > MaxSupportedVersion)\n                    {\n                        throw new NotSupportedException($\"Server '{context.ServerId}' can't process recurring job '{recurringJobId}' of version '{recurringJob.Version ?? 1}'. Max supported version of this server is '{MaxSupportedVersion}'.\");\n                    }\n                    \n                    var backgroundJobs = new List<BackgroundJob>();\n                    var precision = _pollingDelay + _pollingDelay;\n\n                    var executions = recurringJob.ScheduleNext(\n                        _timeZoneResolver,\n                        recurringJob.LastExecution ?? recurringJob.CreatedAt?.AddSeconds(-1) ?? now.AddSeconds(-1),\n                        now,\n                        precision);\n\n                    foreach (var execution in executions)\n                    {\n                        var backgroundJob = _factory.TriggerRecurringJob(\n                            context.Storage,\n                            connection,\n                            _profiler,\n                            recurringJob,","sourceCodeStart":301,"sourceCodeEnd":337,"githubUrl":"https://github.com/HangfireIO/Hangfire/blob/c236dd0f930f831ec151e436e138ddc429a02a72/src/Hangfire.Core/Server/RecurringJobScheduler.cs#L301-L337","documentation":"Thrown by RecurringJobScheduler.ScheduleRecurringJob when a recurring job's stored Version is greater than MaxSupportedVersion (currently 2). Newer Hangfire servers may write higher-version recurring jobs with features older servers don't understand; rather than misprocess them, the older server refuses and reschedules. The job is retried with a warning rather than disabling the whole scheduler.","triggerScenarios":"A mixed-version Hangfire deployment: a newer server creates a v>2 recurring job, then an older server (MaxSupportedVersion=2) picks it up during its polling cycle and throws this inside the per-job try block.","commonSituations":"Rolling upgrade where new and old servers coexist temporarily. A test/staging environment created by a newer version being read by an older one. Pointing an older client/server at storage written by a newer version.","solutions":["Upgrade all processing servers to a version that supports the recurring job's Version (>= the version that wrote it).","Recreate the recurring job with a client whose version matches the servers (to reset Version to a supported value).","During rolling upgrades, drain old servers before new servers write higher-version jobs."],"exampleFix":"// before — mixed versions: v1.8 server reads job written by v1.9+\n// (Version=3 > MaxSupportedVersion=2)\n\n// after — upgrade all servers to the same (latest) version\ndotnet add package Hangfire.Core --version 1.9.0","handlingStrategy":"validation","validationCode":"// Ensure all servers are on a version that supports the recurring job schema version\nvar asm = typeof(RecurringJob).Assembly.GetName().Version;\nif (asm < new Version(1, 7, 0)) throw new InvalidOperationException(\"Upgrade servers to match schema version.\");","typeGuard":null,"tryCatchPattern":"// The scheduler already catches this per-job and retries/disables; monitor the warning log\n// for 'can't process recurring job' and upgrade servers.","preventionTips":["Keep all Hangfire servers on the same version during rolling upgrades.","Recreate recurring jobs with the target version after an upgrade.","Monitor scheduler warning logs for unsupported-version messages."],"tags":["recurring-job","version-mismatch","rolling-upgrade","not-supported"],"backgroundTag":null,"analyzedSha":"c236dd0f930f831ec151e436e138ddc429a02a72","analyzedAt":"2026-08-13T20:27:11.027Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}