Обработка исключений для обработки больших сообщений в BizTalk

Мой первый вопрос о переполнении стека, поэтому, пожалуйста, простите мою глупость/наивность.

У меня есть решение BizTalk 2010 R2, в котором используется Проверка требований шаблон интеграции, реализованный с помощью настраиваемых компонентов конвейера для перемещения больших (в настоящее время до 1 ГБ) файлов .mp4 в папку при получении и их повторного извлечения при отправке, чтобы они не проходили через BizTalkMsgBoxDb.

Иногда мы получаем ошибку при получении файлов, что приводит к возникновению исключений в порту получения. Мы используем параметр «Включить маршрутизацию для ошибочных сообщений», чтобы избежать приостановки экземпляра в системе, но это приводит к перетаскиванию большого файла .mp4 в окно сообщения и, в конечном итоге, EsbExceptionDb. Явно не идеальное решение.

Я мог бы реализовать код в пользовательском компоненте конвейера приема для обработки определенных типов ошибок, но мне интересно, есть ли лучший способ обработки этого, чтобы любое исключение — ожидаемое или неожиданное — приводило к большой файл перенаправляется в сбойное хранилище файлов в другом месте без входа в BizTalkMsgBoxDb в любое время.

Приму любой совет с благодарностью.


person GRoberts    schedule 02.10.2015    source источник
comment
Выполняет ли пользовательский компонент конвейера потоковую передачу файла на диск и заменяет ли pInMsg.BodyPart.Data потоком, содержащим небольшое XML-сообщение для дальнейшей обработки? Что-то вроде этого?   -  person Gruff    schedule 02.10.2015
comment
Да, он делает именно это. Проблема, которую я пытаюсь решить, заключается в том, что когда в этой обработке возникает ошибка (например, у нас недавно была проблема с сетью, из-за которой целевая папка для потоковой записи была недоступна на некоторое время), тогда исходный файл сохраняется в окне сообщения как часть стандартной обработки ошибок.   -  person GRoberts    schedule 05.10.2015


Ответы (2)


Я бы предложил обрабатывать исключения в пользовательском конвейере приема.

Убедитесь, что pInMsg.BodyPart.Data заменяется другим (меньшим) потоком, тогда большой файл не сможет передаваться в BizTalkMsgBoxDb, поскольку BizTalk больше не имеет ссылки на него.

person Gruff    schedule 05.10.2015
comment
Спасибо. Я собираюсь изменить его так, чтобы msg.BodyPart.Data сразу заменялся при обработке, а пользовательская обработка исключений в компоненте конвейера пыталась передать файл в место с ошибкой. Я надеялся на более аккуратное готовое решение, но я думаю, что это оптимизм, учитывая, что мы уже вышли из обычной обработки с помощью пользовательского компонента. - person GRoberts; 07.10.2015

Очевидно, вы должны использовать обработку исключений и убедиться, что pInMsg.BodyPart.Data не пуст. Кроме того, если вы используете пользовательский конвейер, как предлагается в этой статье 'http://www.codeproject.com/Articles/180216/Transfer-Large-Files-using-BizTalk-Receive-Side'

Убедитесь, что вы оптимизировали код в методе execute. В моем случае я заменил цикл while(bytesRead!=0) кодом ниже. Теперь я не вижу никаких проблем в моем пользовательском конвейере, и он работает быстро. с использованием

(var fileStream = File.Create("C:\\Path\\To\\FileName")){originalStream.Seek(0, SeekOrigin.Begin);originalStream.CopyTo(fileStream);}

person Nilesh Sawant    schedule 08.01.2016