NServiceBus - проблема с использованием TransactionScopeOption.Suppress в обработчике сообщений - PullRequest
1 голос
/ 13 сентября 2010

У меня есть конечная точка, у которой есть обработчик сообщений, который выполняет некоторые операции FTP.Поскольку процесс ftp может занять некоторое время, я инкапсулировал метод ftp в TransactionScope с TransactionScopeOption.Suppress для предотвращения исключений тайм-аута транзакции.

Это избавило от исключений тайм-аута, однако обработчик был запущен 5 раз(в моем конфигурационном файле для повторных попыток установлено значение 5)

Файлы были ftp'd нормально, но они были просто ftp'd 5 раз.

обработчик выглядит как перезапущенныйчерез 10 или 11 минут.

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

public void Handle(FtpMessage msg)
{
     using (TransactionScope t = new TransactionScope(TransactionScopeOption.Suppress))
     {
          FtpFile(msg);
     }
}

Любая помощь будет принята с благодарностью.

спасибо.

Ответы [ 3 ]

2 голосов
/ 13 сентября 2010

Если это действительно FTP-соединение, которое не может быть завершено в течение тайм-аута транзакции, другой подход будет заключаться в том, чтобы превратить это в Saga.

Saga будет запущена FtpMessage, а в обработчике она будетзапускать работу FTP асинхронно, либо в другом потоке, либо через другой процесс, или что-то еще, и хранить достаточно данных в данных саги, чтобы иметь возможность посмотреть прогресс позже.

Затем он запросит тайм-аут отTimeoutManager на сколько долго имеет смысл.После получения этого таймаута он будет искать состояние в данных саги и проверять текущую работу FTP.Если она завершена, пометьте сагу как завершенную, если нет, запросите другой тайм-аут.

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

2 голосов
/ 14 сентября 2010

Я бы рекомендовал настроить эту конечную точку как не транзакционную, а не пытаться подавить транзакцию.Сделайте это, включив .IsTransactional (false) в код инициализации, если он размещен самостоятельно, или внедрив IConfigureThisEndpoint, AsA_Client при использовании универсального хоста.

0 голосов
/ 13 сентября 2010

Я предполагаю, что, не заполнив внутреннюю область видимости, вы вызываете откат внешней области, созданной NSB.Это заставит NSB повторить ваше FtpMessage.

Попробуйте добавить: t.Complete ();после вашего звонка в FtpFile и посмотрите, поможет ли это вам.

Редактировать: Перечитав ваш вопрос, я понял, что это не решит вашу проблему с таймаутомВы пытались увеличить время ожидания?(10 минут - это максимальное значение по умолчанию в machine.config, поэтому вы не можете установить его выше без изменения machine.config)

...