NServiceBus - проблема с использованием TransactionScopeOption.Suppress в обработчике сообщений
У меня есть конечная точка, у которой есть обработчик сообщений, который выполняет работу 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 ответа
Я предполагаю, что, не завершив внутреннюю область видимости, вы вызываете откат внешней области, созданной NSB. Это заставит NSB повторить ваше FtpMessage.
Попробуйте добавить: t.Complete(); после вашего звонка в FtpFile и посмотрите, поможет ли это вам.
Изменить: после перечитывания вашего вопроса я понял, что это не решит вашу проблему с тайм-аутом. Вы пытались увеличить время ожидания? (10 минут - это максимальное значение по умолчанию в machine.config, поэтому вы не можете установить его выше без изменения machine.config)
Я бы рекомендовал настроить эту конечную точку как не транзакционную, а не пытаться подавить транзакцию. Сделайте это, включив.IsTransactional(false) в код инициализации, если он является хостингом, или реализовав IConfigureThisEndpoint, AsA_Client при использовании универсального хоста.
Если это действительно FTP-соединение, которое не может быть завершено в течение тайм-аута транзакции, другой подход может заключаться в том, чтобы превратить это в сагу.
Saga запускается с помощью FtpMessage, и в обработчике он запускает работу FTP асинхронно, либо в другом потоке, либо через другой процесс, или что-то еще, и хранит достаточно информации в данных саги, чтобы иметь возможность отслеживать прогресс позже.
Затем он будет запрашивать тайм-аут от TimeoutManager на сколько угодно времени. После получения этого таймаута он будет искать состояние в данных саги и проверять текущую работу FTP. Если он завершен, отметьте сагу как завершенную, если нет, запросите другой тайм-аут.
В качестве альтернативы вы могли бы иметь процесс, оборачивающий связь FTP, которая содержит собственную шину, но не имеет собственных обработчиков сообщений. Он может получить свою информацию FTP через командную строку (включая запрашивающую конечную точку), выполнить свою работу, а затем отправить сообщение обратно запрашивающей конечной точке, сообщив, что оно завершено. Тогда вам не придется ждать тайм-аута, чтобы продолжить процесс.