protected override async Task ProcessItem(string itemId, CancellationToken cancellationToken) { if (!await _lockProvider.AcquireLock($"evt:{itemId}", cancellationToken)) { Logger.LogInformation($"Event locked {itemId}"); return; } try { cancellationToken.ThrowIfCancellationRequested(); var evt = await _persistenceStore.GetEvent(itemId); if (evt.EventTime <= _datetimeProvider.Now.ToUniversalTime()) { var subs = await _persistenceStore.GetSubcriptions(evt.EventName, evt.EventKey, evt.EventTime); var success = true; foreach (var sub in subs.ToList()) { success = success && await SeedSubscription(evt, sub, cancellationToken); } if (success) { await _persistenceStore.MarkEventProcessed(itemId); } } } finally { await _lockProvider.ReleaseLock($"evt:{itemId}"); } }
private async void RunEvents() { while (!_shutdown) { try { var eventId = await _queueProvider.DequeueWork(QueueType.Event); if (eventId != null) { if (await _lockProvider.AcquireLock($"evt:{eventId}")) { try { var evt = await _persistenceStore.GetEvent(eventId); if (evt.EventTime <= DateTime.Now.ToUniversalTime()) { var subs = await _persistenceStore.GetSubcriptions(evt.EventName, evt.EventKey, evt.EventTime); var success = true; foreach (var sub in subs.ToList()) { success = success && await SeedSubscription(evt, sub); } if (success) { await _persistenceStore.MarkEventProcessed(eventId); } } } catch (Exception ex) { _logger.LogError(ex.Message); } finally { await _lockProvider.ReleaseLock($"evt:{eventId}"); } } else { _logger.LogInformation($"Event locked {eventId}"); } } else { await Task.Delay(_options.IdleTime); //no work } } catch (Exception ex) { _logger.LogError(ex.Message); } } }
protected override async Task ProcessItem(string itemId, CancellationToken cancellationToken) { if (!await _lockProvider.AcquireLock($"evt:{itemId}", cancellationToken)) { Logger.LogInformation($"Event locked {itemId}"); return; } try { cancellationToken.ThrowIfCancellationRequested(); var evt = await _persistenceStore.GetEvent(itemId); if (evt?.EventTime <= _datetimeProvider.Now.ToUniversalTime()) { var subs = await _persistenceStore.GetSubcriptions(evt.EventName, evt.EventKey, evt.EventTime); var toQueue = new List <string>(); var complete = true; foreach (var sub in subs.ToList()) { complete = complete && await SeedSubscription(evt, sub, toQueue, cancellationToken); } if (complete) { await _persistenceStore.MarkEventProcessed(itemId); } foreach (var eventId in toQueue) { await QueueProvider.QueueWork(eventId, QueueType.Event); } } } finally { await _lockProvider.ReleaseLock($"evt:{itemId}"); } }