11using System ;
22using System . Linq ;
33using System . Threading ;
4+ using System . Threading . Tasks ;
45using Microsoft . Extensions . Logging ;
56using WorkflowCore . Interface ;
67using WorkflowCore . Models ;
@@ -48,17 +49,41 @@ public void Stop()
4849 /// Poll the persistence store for stashed unpublished events
4950 /// </summary>
5051 private async void PollRunnables ( object target )
52+ {
53+ await PollWorkflows ( ) ;
54+ await PollEvents ( ) ;
55+ await PollCommands ( ) ;
56+ }
57+
58+ private async Task PollWorkflows ( )
5159 {
5260 try
5361 {
5462 if ( await _lockProvider . AcquireLock ( "poll runnables" , new CancellationToken ( ) ) )
5563 {
5664 try
5765 {
58- _logger . LogInformation ( "Polling for runnable workflows" ) ;
66+ _logger . LogInformation ( "Polling for runnable workflows" ) ;
5967 var runnables = await _persistenceStore . GetRunnableInstances ( _dateTimeProvider . Now ) ;
6068 foreach ( var item in runnables )
6169 {
70+ if ( _persistenceStore . SupportsScheduledCommands )
71+ {
72+ try
73+ {
74+ await _persistenceStore . ScheduleCommand ( new ScheduledCommand ( )
75+ {
76+ CommandName = ScheduledCommand . ProcessWorkflow ,
77+ Data = item ,
78+ ExecuteTime = _dateTimeProvider . UtcNow . Ticks
79+ } ) ;
80+ continue ;
81+ }
82+ catch ( Exception ex )
83+ {
84+ _logger . LogError ( ex , ex . Message ) ;
85+ }
86+ }
6287 if ( _greylist . Contains ( $ "wf:{ item } ") )
6388 {
6489 _logger . LogDebug ( $ "Got greylisted workflow { item } ") ;
@@ -79,17 +104,37 @@ private async void PollRunnables(object target)
79104 {
80105 _logger . LogError ( ex , ex . Message ) ;
81106 }
107+ }
82108
109+ private async Task PollEvents ( )
110+ {
83111 try
84112 {
85113 if ( await _lockProvider . AcquireLock ( "unprocessed events" , new CancellationToken ( ) ) )
86114 {
87115 try
88116 {
89- _logger . LogInformation ( "Polling for unprocessed events" ) ;
117+ _logger . LogInformation ( "Polling for unprocessed events" ) ;
90118 var events = await _persistenceStore . GetRunnableEvents ( _dateTimeProvider . Now ) ;
91119 foreach ( var item in events . ToList ( ) )
92120 {
121+ if ( _persistenceStore . SupportsScheduledCommands )
122+ {
123+ try
124+ {
125+ await _persistenceStore . ScheduleCommand ( new ScheduledCommand ( )
126+ {
127+ CommandName = ScheduledCommand . ProcessEvent ,
128+ Data = item ,
129+ ExecuteTime = _dateTimeProvider . UtcNow . Ticks
130+ } ) ;
131+ continue ;
132+ }
133+ catch ( Exception ex )
134+ {
135+ _logger . LogError ( ex , ex . Message ) ;
136+ }
137+ }
93138 if ( _greylist . Contains ( $ "evt:{ item } ") )
94139 {
95140 _logger . LogDebug ( $ "Got greylisted event { item } ") ;
@@ -111,5 +156,39 @@ private async void PollRunnables(object target)
111156 _logger . LogError ( ex , ex . Message ) ;
112157 }
113158 }
159+
160+ private async Task PollCommands ( )
161+ {
162+ try
163+ {
164+ if ( await _lockProvider . AcquireLock ( "poll-commands" , new CancellationToken ( ) ) )
165+ {
166+ try
167+ {
168+ _logger . LogInformation ( "Polling for scheduled commands" ) ;
169+ await _persistenceStore . ProcessCommands ( new DateTimeOffset ( _dateTimeProvider . UtcNow ) , async ( command ) =>
170+ {
171+ switch ( command . CommandName )
172+ {
173+ case ScheduledCommand . ProcessWorkflow :
174+ await _queueProvider . QueueWork ( command . Data , QueueType . Workflow ) ;
175+ break ;
176+ case ScheduledCommand . ProcessEvent :
177+ await _queueProvider . QueueWork ( command . Data , QueueType . Event ) ;
178+ break ;
179+ }
180+ } ) ;
181+ }
182+ finally
183+ {
184+ await _lockProvider . ReleaseLock ( "poll-commands" ) ;
185+ }
186+ }
187+ }
188+ catch ( Exception ex )
189+ {
190+ _logger . LogError ( ex , ex . Message ) ;
191+ }
192+ }
114193 }
115194}
0 commit comments