Перенести сообщение в очередь ошибок с помощью Rebus и Oracle DB - PullRequest
0 голосов
/ 19 июня 2020

Для моего проекта у меня есть реализация Rebus, и я использую Oracle DB. https://github.com/rebus-org/Rebus.Oracle Я вижу, что у Rebus есть обработка ошибок, и он должен отправлять сообщение об ошибке в очередь ошибок. Как мне заставить это работать с Oracle DB?

Я использую конфигурацию ниже

                var configurer = Rebus.Config.Configure.With(activator)
                .Logging(l => l.Serilog())
                .Transport(t => t.UseOracle(connectionString.ConnectionString, rebusConfiguration.QueueName, topic))
                .Subscriptions(s => s.StoreInOracle(connectionString.ConnectionString, "subscriptions", isCentralized: true));

Когда я показываю исключение в подписчике, я хочу, чтобы сообщение go было очередь ошибок.

Код абстрактного обработчика

 public abstract class OracleQueueHandler<TMessage> : IHandler<TMessage>, IDisposable
{
    protected readonly ILoggingAdapter<OracleQueueHandler<TMessage>> _logger;
    protected IServiceScope _scope;

    protected OracleQueueHandler(ILoggingAdapter<OracleQueueHandler<TMessage>> logger)
    {
        _logger = logger;
    }

    protected abstract Task ExecuteHandle(TMessage message);

    public async Task Handle(TMessage message)
    {
        using (LogContext.PushProperty(LoggingProperties.ALPHA_EVENT_ID, (message is IInternalMessage) ? (message as IInternalMessage).AlphaEventId : Guid.NewGuid().ToString()))
        using (LogContext.PushProperty(LoggingProperties.PARTITION_ID, (message is IInternalMessage) ? (message as IInternalMessage).GetPartitionId() : Guid.NewGuid().ToString()))
        {
            try
            {
                using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    await ExecuteHandle(message);
                    transactionScope.Complete();
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(new LogItem
                {
                    Message = $"Cannot handle message of type {GetType().Name}. {ex.Message}",
                    Exception = ex
                });
                throw ex;
            }
        }
    }

    public void SetScope(IServiceScope scope)
    {
        _scope = scope;
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            _scope.Dispose();
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

Код обработчика

 public class NewActionRequestMessageHandler : OracleQueueHandler<NewActionRequestMessage>
{
    public NewActionRequestMessageHandler(ILoggingAdapter<OracleQueueHandler<NewActionRequestMessage>> logger) : base(logger)
    { }

    protected override async Task ExecuteHandle(NewActionRequestMessage message)
    {
        throw new Exception();
    }
}

Вот что я получаю в журнале:

[12:22:01] Идентификатор альфа-события: 12345 Идентификатор раздела: 160184 - {"message": "Невозможно обработать сообщение типа NewActionRequestMessageHandler. Возникло исключение типа 'System.Exception'.", "Context": "OracleQueueHandler : Handle "," convertException ": {" type ":" System.Exception, System.Private.CoreLib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e "," message ":" Исключение типа 'System. Возникло исключение. "}," StackTrace ":" в GD.SampleRequirementCoordinator.Processor.Business.Handlers.ActionRequests.NewActionRequestMessageHandler.ExecuteHandle (сообщение NewActionRequestMessage) в C: \ Repositories-координатор-координатор-образец \ GD.SampleRequirementC oordinator.Processor \ Business \ Handlers \ ActionRequests \ NewActionRequestMessageHandler.cs: строка 45 \ r \ n в GD.SampleRequirementCoordinator.MessageQueue. Oracle .OracleQueueHandler 1.Handle(TMessage message) in C:\\Repositories\\gd-sample-requirement-coordinator\\src\\GD.SampleRequirementCoordinator.MessageQueue.Oracle\\Subscriber\\OracleQueueHandler.cs:line 34 "} [12:22:03] Alpha event ID: Partition ID: - Unhandled exception 1 while handling message with ID "3cf26976-8fd4-40bd-9b4c-4bcc52e7ebf4" System.Exception: Exception of type 'System.Exception' was thrown. at GD.SampleRequirementCoordinator.MessageQueue.Oracle.OracleQueueHandler 1.Handle (сообщение TMessage) в * 1032ies *: \ Repositor -sample-requirements -ordinator \ src \ GD.SampleRequirementCoordinator.MessageQueue.Oracle \ Subscriber \ OracleQueueHandler.cs: строка 45 в Rebus.Pipeline.Receive.HandlerInvoker 1.Invoke() at Rebus.Pipeline.Receive.DispatchIncomingMessageStep.Process(IncomingStepContext context, Func 1 далее) в Rebus.Sagas.LoadSagaDataStep.Pro , Fun c1 next) at Rebus.Pipeline.Receive.ActivateHandlersStep.Process(IncomingStepContext context, Func 1 далее) в Rebus.Pipeline.Receive.HandleRoutingSlipsStep.Process (IncomingStepContext context, Fun c1 next) at Rebus.Pipeline.Receive.DeserializeIncomingMessageStep.Process(IncomingStepContext context, Func 1 далее) в Rebus.DataBus.ClaimCheck.HydrateIncomingMessageStep.Process (IncomingStepContext c1 next) at Rebus.Retry.FailFast.FailFastStep.Process(IncomingStepContext context, Func 1 далее) в Rebus.Retry.Simple.SimpleRetryStrategyStep.DispatchWithTrackerIdentifier (Func`1 next, String identifierToTrackMessageBy, ITransactionContext transactionContext, String messageId, String secondLevelMessageId)

* 1026
...