/// <summary> /// Poll the persistence store for workflows ready to run. /// Poll the persistence store for stashed unpublished events /// </summary> private void PollRunnables(object target) { try { if (LockProvider.AcquireLock("poll runnables").Result) { try { Logger.LogInformation("Polling for runnable workflows"); IPersistenceProvider persistenceStore = _serviceProvider.GetService <IPersistenceProvider>(); var runnables = persistenceStore.GetRunnableInstances().Result; foreach (var item in runnables) { Logger.LogDebug("Got runnable instance {0}", item); QueueProvider.QueueForProcessing(item); } } finally { LockProvider.ReleaseLock("poll runnables").Wait(); } } } catch (Exception ex) { Logger.LogError(ex.Message); } try { if (LockProvider.AcquireLock("unpublished events").Result) { try { Logger.LogInformation("Polling for unpublished events"); IPersistenceProvider persistenceStore = _serviceProvider.GetService <IPersistenceProvider>(); var events = persistenceStore.GetUnpublishedEvents().Result.ToList(); foreach (var item in events) { Logger.LogDebug("Got unpublished event {0} {1}", item.EventName, item.EventKey); QueueProvider.QueueForPublishing(item).Wait(); persistenceStore.RemoveUnpublishedEvent(item.Id).Wait(); } } finally { LockProvider.ReleaseLock("unpublished events").Wait(); } } } catch (Exception ex) { Logger.LogError(ex.Message); } }
public async Task PublishEvent(string eventName, string eventKey, object eventData) { if (_shutdown) { throw new Exception("Host is not running"); } Logger.LogDebug("Publishing event {0} {1}", eventName, eventKey); var subs = await PersistenceStore.GetSubcriptions(eventName, eventKey); foreach (var sub in subs.ToList()) { EventPublication pub = new EventPublication(); pub.Id = Guid.NewGuid(); pub.EventData = eventData; pub.EventKey = eventKey; pub.EventName = eventName; pub.StepId = sub.StepId; pub.WorkflowId = sub.WorkflowId; await QueueProvider.QueueForPublishing(pub); await PersistenceStore.TerminateSubscription(sub.Id); } }