The Tasks service uses RabbitMQ via MassTransit 8.2.5 for asynchronous messaging. It operates two bus instances and uses BusProxy for outbound publishing with fallback strategies.
Trigger: Successful unscheduling of recurring generation
Pattern: Response to IUnscheduleRecurringTaskInstanceGenerationRequest
UnscheduleRecurringTaskInstanceGenerationFailed
Trigger: Failed unscheduling of recurring generation
Pattern: Response to IUnscheduleRecurringTaskInstanceGenerationRequest
Quartz Scheduling
Backend: PostgreSQL persistent store
Scheduler ID: AUTO (clustered)
Serializer: Newtonsoft JSON
Max Batch Size: 10 triggers per batch
Misfire Threshold: 1.5 hours
Scheduled Jobs
Job
Message
Description
GenerateTaskInstancesSchedule
ITaskInstanceGenerationRequested
Recurring per-facility task instance generation
Schedule Identity:
Schedule ID: FacilityScheduleId(facilityId) // unique per facility
Group: ScheduleGroupName // shared group
Retry Policies
Context
Retries
Backoff
Exception
BusinessUnitChange consumer
5
5s, 30s, 1m, 3m, 5m
All
SQL connection (MQServices)
5
Exponential: 10ms → 100s
SqlException
Task instance generator
5
Exponential: 10ms → 100s
All
HTTP clients (Polly)
Configured
Exponential
Transient HTTP
Message Flow Diagrams
1. Business Unit Activation → Task Generation
Customers Service
→ publishes IBusinessUnitChangeV1
→ RabbitMQ (Main Bus)
→ BusinessUnitChangeConsumer
→ TaskInstanceGenerationHandler
→ Schedules Quartz job for recurring generation
→ Quartz fires ITaskInstanceGenerationRequested
→ TaskInstanceGenerationConsumer
→ Generates task instances in SQL Server
2. Schedule Lifecycle
API: POST /Schedules (create)
→ Persists to SQL Server
→ Publishes ScheduleCreatedEvent via BusProxy
→ Scheduling Service receives event
Scheduling Service
→ Publishes IScheduleCreatedEvent
→ RabbitMQ (Scheduling Bus)
→ ScheduleCreatedConsumer
→ Triggers instance generation
3. Task Completion
API: POST /Instances/{id}/commands/complete
→ Updates instance status in SQL Server
→ Publishes TaskInstanceCompletedEvent via BusProxy
→ External systems receive event
API: POST /commands/scheduleRecurringTaskInstanceGeneration
→ MassTransit RequestClient
→ IScheduleRecurringTaskInstanceGenerationRequest
→ TaskInstanceGenerationConsumer
→ Configures Quartz schedule
→ Responds: Succeeded or Failed
→ API returns result to caller