NServiceBus Stop при фатальной ошибке - PullRequest
1 голос
/ 14 марта 2012

Мы используем NServiceBus для распространения сообщений об изменениях данных в одной системе на другие системы в нашей среде.

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

Какой лучший способ сделать это?

EDIT: Вот мои текущие настройки

        Configure.With()
            .DefiningCommandsAs(t => typeof(ICommand).IsAssignableFrom(t))
            .DefiningEventsAs(t => typeof(IEvent).IsAssignableFrom(t))
            .DefiningMessagesAs(t => typeof(IMessage).IsAssignableFrom(t))
            .Log4Net<NlogAppenderForLog4Net>(a => { })
            .NinjectBuilder(Kernel)
            .XmlSerializer()
            .MsmqTransport()
                .DefineEndpointName("consumer.input")
                .IsTransactional(true)
                .PurgeOnStartup(false)
            .MsmqSubscriptionStorage("consumer")
            .UnicastBus()
                .LoadMessageHandlers()
                .ImpersonateSender(false)
            .CreateBus().Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());

1 Ответ

2 голосов
/ 14 марта 2012

Возможно, вы захотите реализовать интерфейс IManageMessageFailures. Этот интерфейс дает вам доступ к исключению и сообщению:

public interface IManageMessageFailures
{
    void SerializationFailedForMessage(TransportMessage message, Exception e);
    void ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e);
}

Если это не удастся, то все, что вы укажете в своей конфигурации, вызовет действие, которое нужно предпринять. Это делается через DefineCriticalErrorAction(Action onCriticalError). По умолчанию количество рабочих потоков устанавливается на 0, что позволяет замедлить процесс. Вы можете сделать это прямо в вашем менеджере ошибок. Вы должны иметь возможность подключиться к транспортному слою, чтобы добавить нити обратно.

...