Сопоставитель BizTalk и атрибут [ThreadStatic]
Недавно я столкнулся с проблемой многопоточной природы BizTalk Mapper и того, как он обрабатывает внешние сборки.
Как указывает эта цитата из MSDN:
Важно! Любой код, написанный во внешней сборке для использования в скриптообразном функтоиде, должен быть потокобезопасным. Это необходимо, потому что несколько экземпляров карты могут использовать эти экземпляры.NET во время выполнения в стрессовых условиях.
Mapper будет повторно использовать экземпляры внешних сборок.
В сборке утилиты, которую использовала моя команда, у нас был следующий код:
public class MapUtil
{
private string _storeReference;
public void SetStoreReference(string ref)
{
_storeReference = ref;
}
public string GetStoreReference()
{
return _storeReference;
}
}
Это вызывало привязку ссылок магазина из одного файла к разным файлам.
Я (кажется), чтобы исправить это, украсив личное поле с [ThreadStatic]
[ThreadStatic]
private static string _storeReference;
Мой вопрос - кто-нибудь знает какие-либо проблемы с этим в BizTalk Mapper? Я знаю, что есть проблемы с использованием [ThreadStatic]
в Asp.Net, например, из-за повторного использования потоков, но не может найти документацию о том, как картограф BizTalk работает с потоками.
2 ответа
Я до сих пор не нашел однозначного утверждения в духе "Потоковое поведение в BizTalk Mapper - это xyz, поэтому вам следует позаботиться о том, чтобы вы использовали метод abc", и я не уверен, что такой ответ придет откуда угодно. вне команды разработчиков BizTalk.
Мой единственный коллега, имеющий прямые контакты с командой разработчиков, находится в длительном рождественском отпуске (счастливчик), поэтому до его возвращения я просто думал, что отмечу, что с внесенными в наш код изменениями мы не видели ни одного повторения проблем с потоками производственный сервер большого объема.
Что ж, это не совсем так, мне удалось пропустить ключевое слово static из одного свойства моего вспомогательного класса, и для этого свойства мы все еще видели проблемы с многопоточностью. Я приму это как доказательство ThreadStatic
быть правильным путем идти на данный момент.
Я использовал ThreadStatic, чтобы установить переменную пользовательского конвейера приема, а затем получить доступ к ее значению в BizTalk Map (через вспомогательный класс). До сих пор не было никаких проблем - проверено с ~50 параллельными вызовами.