Сопоставитель 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 параллельными вызовами.

Другие вопросы по тегам