public async Task HandleAsync(IRuleEventEntity @event) { if (!executing.TryAdd(@event.Id, false)) { return; } try { var job = @event.Job; var(response, elapsed) = await ruleService.InvokeAsync(job.ActionName, job.ActionData); var jobDelay = ComputeJobDelay(response.Status, @event, job); var jobResult = ComputeJobResult(response.Status, jobDelay); var now = clock.GetCurrentInstant(); var update = new RuleJobUpdate { Elapsed = elapsed, ExecutionDump = response.Dump, ExecutionResult = response.Status, Finished = now, JobNext = jobDelay, JobResult = jobResult }; await ruleEventRepository.UpdateAsync(@event.Job, update); if (response.Status == RuleResult.Failed) { log.LogWarning(response.Exception !, w => w .WriteProperty("action", "SendRuleEvent") .WriteProperty("status", "Failed") .WriteProperty("ruleId", @event.Job.RuleId.ToString()) .WriteProperty("ruleDescription", @event.Job.Description) .WriteProperty("dump", response.Dump)); } } catch (Exception ex) { log.LogError(ex, w => w .WriteProperty("action", "SendRuleEvent") .WriteProperty("status", "Failed")); } finally { executing.TryRemove(@event.Id, out _); } }
public async Task HandleAsync(IRuleEventEntity @event) { if (!executing.TryAdd(@event.Id, false)) { return; } try { var job = @event.Job; var(response, elapsed) = await ruleService.InvokeAsync(job.ActionName, job.ActionData); var jobDelay = ComputeJobDelay(response.Status, @event, job); var jobResult = ComputeJobResult(response.Status, jobDelay); var now = clock.GetCurrentInstant(); var update = new RuleJobUpdate { Elapsed = elapsed, ExecutionDump = response.Dump, ExecutionResult = response.Status, Finished = now, JobNext = jobDelay, JobResult = jobResult }; await ruleEventRepository.UpdateAsync(@event.Job, update); if (response.Status == RuleResult.Failed) { log.LogWarning(response.Exception, "Failed to execute rule event with rule id {ruleId}/{description}: {dump}", @event.Job.RuleId, @event.Job.Description, response.Dump); } } catch (Exception ex) { log.LogError(ex, "Failed to execute rule event with internal error."); } finally { executing.TryRemove(@event.Id, out _); } }