Для моего проекта у меня есть реализация 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