NServiceBus: сообщения обрабатываются несколько раз - PullRequest
1 голос
/ 28 марта 2011

Я в полной растерянности относительно того, почему я испытываю эту проблему. Я новичок в NServiceBus и до сих пор установил простой простой «сервер», который прослушивает сообщения, отправленные веб-приложением. Сервер запрашивает пользовательскую инициализацию (IWantCustomInitialization) и использует пользовательский компоновщик для Castle Windsor 2.5.1 . Этот пользовательский компоновщик в основном является копией того, который поставляется с исходным кодом NServiceBus, с двумя незначительными изменениями, чтобы отойти от методов, которые устарели в Windsor 2.5.

Обратите внимание, что мой код делит экземпляр контейнера с NServiceBus.

Проблема, с которой я сталкиваюсь, заключается в том, что каждое сообщение, отправленное веб-приложением, обрабатывается сервером пять (5) раз. В файлах журнала есть пять записей для каждой попытки, а пятая попытка выглядит следующим образом:

2011-03-28 16:04:10,326 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleEndMessage' on NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule
2011-03-28 16:04:10,327 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleEndMessage' on Server.NHibernateSessionMessageModule
2011-03-28 16:04:10,341 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleError' on NServiceBus.SagaPersisters.NHibernate.NHibernateMessageModule
2011-03-28 16:04:10,342 [Worker.8] DEBUG NServiceBus.Unicast.UnicastBus [] - Calling 'HandleError' on Server.NHibernateSessionMessageModule
2011-03-28 16:04:10,344 [Worker.8] ERROR NServiceBus.Unicast.Transport.Msmq.MsmqTransport [] - Message has failed the maximum number of times allowed, ID=80cffd98-a5bd-43e0-a482-a2d96ca42b22\20677.

У меня есть нет указание, почему сообщение терпит неудачу, и я не знаю, где копать для получения дополнительной информации / вывода.

Конфигурация «конечная точка» выглядит следующим образом:

public void Init()
{
    container = Windsor.Container;
    NServiceBus.Configure.With().CastleWindsor251Builder(container).XmlSerializer().MsmqTransport().IsolationLevel(System.Transactions.IsolationLevel.Unspecified);

    var masterInstaller = new NotificationServerInstaller();
    masterInstaller.Install(container, null);
}

Обработчик сообщений на данном этапе действительно изобретен и выглядит следующим образом:

public class NewUserMessageHandler : IHandleMessages<NotifyNewUserMessage>
{
    private readonly IGetUserQuery _getUserQuery;

    public NewUserMessageHandler(IGetUserQuery getUserQuery)
    {
        _getUserQuery = getUserQuery;
    }

    public void Handle(NotifyNewUserMessage message)
    {
        var result = _getUserQuery.Invoke(new GetUserRequest { Id = new Guid("C10D0684-D25F-4E5E-A347-16F85DB7BFBF") });
        Console.WriteLine("New message received: {0}", message.UserSystemId);
    }
}

Если первая строка в методе-обработчике закомментирована, сообщение обрабатывается только один раз.

Я обнаружил в сети некоторые сообщения / темы (включая StackOverflow), в которых говорится о схожих проблемах, в частности http://tech.groups.yahoo.com/group/nservicebus/message/5977 и Кто-нибудь использует Ninject 2.0 в качестве nServiceBus ObjectBuilder? - но у меня нет не удалось решить мою проблему.

Я был бы очень признателен за любую помощь. Я n00b в NServiceBus!

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

NServiceBus не обрабатывает его несколько раз, по умолчанию он будет повторять 5 раз, если возникнет исключение, вы можете установить это в файле конфигурации. Включены ли у вас распределенные транзакции? Поскольку вы фиксируете базу данных и у вас есть открытая транзакция (транзакция очереди), когда вы открываете другую транзакцию, она попытается обновить ее до распределенной транзакции, я думаю, что это может быть проблемой. Вы работали с консольным приложением? Вы должны увидеть там что-нибудь.

1 голос
/ 29 марта 2011

Я бы порекомендовал обернуть тело метода Handle в try / catch, добавить точку останова в catch и посмотреть, что не так.Как только вы решите это, удалите попытку / поймать.

...