public virtual void Handle(IMessageMetadataEnvelop <TMessage> msg) { _monitor.IncrementMessagesReceived(); _log.Trace("Handler actor got message: {@Message}", msg); try { var handlerWithMetadata = _handler as IHandlerWithMetadata <TMessage>; if (handlerWithMetadata != null) { handlerWithMetadata.Handle(msg.Message, msg.Metadata); } else { _handler.Handle(msg.Message); } } catch (Exception e) { _log.Error(e, "Handler actor raised an error on message process: {@Message}", msg); var metadata = msg.Metadata.CreateChild(Guid.Empty, new ProcessEntry(typeof(THandler).Name, MessageHandlingStatuses.PublishingFault, MessageHandlingStatuses.MessageProcessCasuedAnError)); var fault = Fault.New(msg.Message, e, GetSagaId(msg.Message), typeof(THandler)); _publisher.Publish(fault, metadata); } }
private async Task Schedule(ScheduleCommandExecution message) { ScheduleKey key = message.Key; try { _logger.Debug($"Scheduling job {key} for {message.Options.RunAt}"); var job = QuartzJob.Create(message.Key, message.Command, message.CommandMetadata, message.Options); var trigger = TriggerBuilder.Create() .WithIdentity(job.Key.Name, job.Key.Group) .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionFireNow().WithRepeatCount(0)) .StartAt(message.Options.RunAt) .Build(); var fireTime = await _scheduler.ScheduleJob(job, trigger); var scheduleConfirmation = new CommandExecutionScheduled(message.Command.Id, fireTime.UtcDateTime); Sender.Tell(scheduleConfirmation); _publisher.Publish(scheduleConfirmation, message.CommandMetadata); } catch (Exception e) { _logger.Error(e, "Error while scheduled job {Task}", key); if (e is JobPersistenceException && e.InnerException?.GetType() == typeof(ObjectAlreadyExistsException)) { Sender.Tell(new AlreadyScheduled(key)); } else { Sender.Tell(new Status.Failure(e)); } var fault = Fault.New(message, e, message.Command.ProcessId, typeof(SchedulingActor)); _publisher.Publish(fault, message.CommandMetadata); } }