Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
            }
        }