NServiceBus - проблема с использованием TransactionScopeOption.Suppress в обработчике сообщений

63
5

У меня есть конечная точка, у которой есть обработчик сообщений, который работает с некоторыми 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);
}
}

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


спасибо.

спросил(а) 2021-01-25T12:39:39+03:00 4 месяца, 3 недели назад
1
Решение
77

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


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


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


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

ответил(а) 2021-01-25T12:39:39+03:00 4 месяца, 3 недели назад
78

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

ответил(а) 2021-01-25T12:39:39+03:00 4 месяца, 3 недели назад
45

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


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

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

ответил(а) 2021-01-25T12:39:39+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема