{"record":{"id":"714c753f5f4bf443","repo":"dotnet/orleans","slug":"no-istreamqueuecheckpointer-is-configured-with-per-714c75","errorCode":null,"errorMessage":"No IStreamQueueCheckpointer is configured with PersistentStreamProvider {this.name}. Please configure one.","messagePattern":"No IStreamQueueCheckpointer is configured with PersistentStreamProvider (.+?)\\. Please configure one\\.","errorType":"validation","errorClass":"OrleansConfigurationException","httpStatus":null,"severity":"critical","filePath":"src/Azure/Orleans.Streaming.EventHubs/Providers/Streams/EventHub/EventHubStreamOptions.cs","lineNumber":206,"sourceCode":"                throw new OrleansConfigurationException($\"{nameof(EventHubOptions)} on stream provider {this.name} is invalid. {nameof(EventHubOptions.EventHubName)} is invalid\");\n            }\n        }\n    }\n\n    public class StreamCheckpointerConfigurationValidator : IConfigurationValidator\n    {\n        private readonly IServiceProvider services;\n        private readonly string name;\n        public StreamCheckpointerConfigurationValidator(IServiceProvider services, string name)\n        {\n            this.services = services;\n            this.name = name;\n        }\n        public void ValidateConfiguration()\n        {\n            var checkpointerFactory = services.GetKeyedService<IStreamQueueCheckpointerFactory>(this.name);\n            if (checkpointerFactory == null)\n                throw new OrleansConfigurationException($\"No IStreamQueueCheckpointer is configured with PersistentStreamProvider {this.name}. Please configure one.\");\n        }\n    }\n\n    public class EventHubReceiverOptions\n    {\n        /// <summary>\n        /// Optional parameter that configures the receiver prefetch count.\n        /// </summary>\n        public int? PrefetchCount { get; set; }\n        /// <summary>\n        /// In cases where no checkpoint is found, this indicates if service should read from the most recent data, or from the beginning of a partition.\n        /// </summary>\n        public bool StartFromNow { get; set; } = DEFAULT_START_FROM_NOW;\n        private const bool DEFAULT_START_FROM_NOW = true;\n    }\n\n    public class EventHubStreamCachePressureOptions\n    {","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Orleans.Streaming.EventHubs/Providers/Streams/EventHub/EventHubStreamOptions.cs#L188-L224","documentation":"Thrown by StreamCheckpointerConfigurationValidator.ValidateConfiguration at startup when no keyed IStreamQueueCheckpointerFactory is registered for the PersistentStreamProvider name. The EventHub adapter requires a checkpointer to persist read offsets.","triggerScenarios":"Configuring a PersistentStreamProvider with the EventHub adapter but not registering the checkpointer (e.g. missing AddAzureTableCheckpointer / AddGrainBasedCheckpointer) for that provider name.","commonSituations":"Following a receiver-only setup sample that omits checkpointing; migrating to a version where the checkpointer must be registered explicitly; keying the checkpointer under a different name than the stream provider.","solutions":["Register a checkpointer factory for the provider name, e.g. config.AddAzureTableCheckpointer(...) inside the stream configuration.","Ensure the keyed service name matches the PersistentStreamProvider name exactly.","For dev/test, use AddGrainBasedCheckpointer as a lighter alternative."],"exampleFix":"// before\nsiloBuilder.AddEventHubStreams(\"EH\", c =>\n{\n    c.ConfigureEventHubConnection(...);\n    // no checkpointer registered\n});\n\n// after\nsiloBuilder.AddEventHubStreams(\"EH\", c =>\n{\n    c.ConfigureEventHubConnection(...);\n    c.UseAzureTableCheckpointer(ob => ob.Configure(o =>\n    {\n        o.TableName = \"checkpoints\";\n        o.ConnectionString = azureStorageConn;\n    }));\n});","handlingStrategy":"validation","validationCode":"var cp = services.GetKeyedService<IStreamQueueCheckpointerFactory>(providerName);\nif (cp is null) throw new OrleansConfigurationException(\"Register a checkpointer for \" + providerName);","typeGuard":"static bool HasCheckpointer(IServiceProvider sp, string name) =>\n    sp.GetKeyedService<IStreamQueueCheckpointerFactory>(name) is not null;","tryCatchPattern":null,"preventionTips":["Use a stream-configuration helper that always registers a checkpointer.","Keep the checkpointer keyed name identical to the stream provider name."],"tags":["eventhubs","configuration","startup","azure","checkpointer"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}