Example #1
0
        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 _);
            }
        }
Example #2
0
        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 _);
            }
        }