Custom Scheduler
To add support for a different scheduler provider, implement the appropriate interfaces based on your use case.
Message Scheduler
The message scheduler is used by IAmAMessageProducer (sync/async) when:
The transport lacks native delay support, or
The delay exceeds the transport's threshold (e.g., AWS SQS 15-minute limit).
Implementation Steps
Schedule Messages Implement
IAmAMessageSchedulerAsyncandIAmAMessageSchedulerSyncto interface with your scheduler:public class CustomMessageScheduler : IAmAMessageSchedulerAsync, IAmAMessageSchedulerSync { private readonly CustomSchedulerAPI _scheduler; public CustomMessageScheduler(CustomSchedulerAPI scheduler) { _scheduler = scheduler; } public async Task<string> ScheduleAsync(Message message, DateTimeOffset at) { return await _scheduler.ScheduleAsync( new CustomSchedulerObject { Data = new { Message = message, Async = true }, At = at }); } public string Schedule(Message message, DateTimeOffset at) { return _scheduler.Schedule( new CustomSchedulerObject { Data = new { Message = message, Async = false }, At = at }); } }Handle Scheduled Messages When the scheduler triggers, forward the message to Brighter:
public class CustomSchedulerHandler { private readonly IAmACommandProcessor _processor; public CustomSchedulerHandler(IAmACommandProcessor processor) { _processor = processor; } public async Task ExecuteAsync(CustomSchedulerObject obj) { await _processor.SendAsync(new FireSchedulerMessage { Message = obj.Data.Message, Async = obj.Data.Async }); } }Register the Scheduler Implement
IAmAMessageSchedulerFactoryto integrate with Brighter.
Request Scheduler
The request scheduler is used by IAmACommandProcessor when methods like Send, Publish, or Post are called with a DateTimeOffset or TimeSpan.
Implementation Steps
Schedule Requests Implement
IAmARequestSchedulerAsyncandIAmARequestSchedulerSync:public class CustomRequestScheduler : IAmARequestSchedulerAsync, IAmARequestSchedulerSync { private readonly CustomSchedulerAPI _scheduler; public CustomRequestScheduler(CustomSchedulerAPI scheduler) { _scheduler = scheduler; } public async Task<string> ScheduleAsync<T>(T request, SchedulerType type, DateTimeOffset at) { return await _scheduler.ScheduleAsync( new CustomSchedulerObject { Data = new { RequestType = typeof(T).FullName, Data = Serialize(request), Async = true }, At = at }); } public string Schedule<T>(T request, SchedulerType type, DateTimeOffset at) { return _scheduler.Schedule( new CustomSchedulerObject { Data = new { RequestType = typeof(T).FullName, Data = Serialize(request), Async = false }, At = at }); } }Handle Scheduled Requests Forward requests to Brighter for processing:
public class CustomRequestHandler { private readonly IAmACommandProcessor _processor; public CustomRequestHandler(IAmACommandProcessor processor) { _processor = processor; } public async Task ExecuteAsync(CustomSchedulerObject obj) { await _processor.SendAsync(new FireRequestMessage { RequestType = obj.Data.RequestType, RequestData = obj.Data.Data, Async = obj.Data.Async }); } }Register the Scheduler Implement
IAmARequestSchedulerFactoryto integrate with Brighter.
Key Requirements
Flow Preservation: Ensure
Async = true/falseis set correctly to match the original call (sync/async).Serialization: Use a consistent format (e.g., JSON) for
RequestDatainFireRequestMessage.
Note: Replace CustomSchedulerAPI, CustomSchedulerObject, and serialization logic with your actual implementation details.
Last updated
Was this helpful?
