Open Closed

Scheduling messages with Azure Service Bus #7302


User avatar
0
rogercprops created
  • ABP Framework version: 7.2.2
  • UI Type: N/A
  • Database System: EF Core (SQL Server)
  • Tiered (for MVC) or Auth Server Separated (for Angular): yes
  • Exception message and full stack trace: N/A
  • Steps to reproduce the issue: N/A

We have a number of use cases where it would be ideal to utilize the Azure Service Bus message scheduling feature https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing, but I can't find anything in the documentation, samples, blog posts or anywhere that shows how to do that.

For example when a client schedules an appointment we'd like to send reminders via SMS and/or email at various intervals (e.g. one week prior, 2 days prior to scheduled date).

Is this possible using AzureDistributedEventBus and if so, what are the detailed steps to implement?

Thank you.


2 Answer(s)
  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi,

    You need to override the PublishAsync method of AzureDistributedEventBus

    For example:

    public interface IEventDataHasScheduledEnqueueTime
    {
        DateTimeOffset ScheduledEnqueueTime { get; set; }
    }
    
    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(IDistributedEventBus), typeof(AzureDistributedEventBus))]
    public class MyAzureDistributedEventBus : AzureDistributedEventBus
    {
        public MyAzureDistributedEventBus(IServiceScopeFactory serviceScopeFactory, ICurrentTenant currentTenant, IUnitOfWorkManager unitOfWorkManager, IOptions<AbpDistributedEventBusOptions> abpDistributedEventBusOptions, IGuidGenerator guidGenerator, IClock clock, IOptions<AbpAzureEventBusOptions> abpAzureEventBusOptions, IAzureServiceBusSerializer serializer, IAzureServiceBusMessageConsumerFactory messageConsumerFactory, IPublisherPool publisherPool, IEventHandlerInvoker eventHandlerInvoker, ILocalEventBus localEventBus, ICorrelationIdProvider correlationIdProvider) : base(serviceScopeFactory, currentTenant, unitOfWorkManager, abpDistributedEventBusOptions, guidGenerator, clock, abpAzureEventBusOptions, serializer, messageConsumerFactory, publisherPool, eventHandlerInvoker, localEventBus, correlationIdProvider)
        {
        }
    
        protected async override Task PublishAsync(string eventName, object eventData)
        {
            var body = Serializer.Serialize(eventData);
            var message = new ServiceBusMessage(body)
            {
                Subject = eventName
            };
            
            if (eventData is IEventDataHasScheduledEnqueueTime eventDataHasScheduledEnqueueTime)
            {
                message.ScheduledEnqueueTime = eventDataHasScheduledEnqueueTime.ScheduledEnqueueTime;
            }
    
            if (message.MessageId.IsNullOrWhiteSpace())
            {
                message.MessageId = GuidGenerator.Create().ToString("N");
            }
    
            message.CorrelationId = CorrelationIdProvider.Get();
    
            var publisher = await PublisherPool.GetAsync(
                Options.TopicName,
                Options.ConnectionName);
    
            await publisher.SendMessageAsync(message);
        }
    }
    
  • User Avatar
    0
    rogercprops created

    If you read this after I deleted the answer please disregard.

    I determined that the message was in fact not being scheduled in the future by inspecting the message properties in ASB.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
Do you need assistance from an ABP expert?
Schedule a Meeting
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.2.0-preview. Updated on March 20, 2025, 18:00