#c# #ssis #appdomain
#c# #ssis #appdomain
Вопрос:
у нас есть веб-приложение, которое работает совместно с локальным исполняемым файлом, настроенным как служба Windows. По замыслу веб-приложение должно выполнять все пакетные задания через службу (оно может запускать их само по себе, опять же, просто не в соответствии с предполагаемым дизайном и тем, что я не контролирую). Одно из этих пакетных заданий выполняет пакеты SSIS. Мы наткнулись на проблему с сервисом, когда он выполняет пакеты SSIS таким образом, что он застревает после запуска пакетов более двух раз. На этом этапе мы должны перезапустить службу, чтобы позволить ей снова запускать пакеты SSIS. Мы не сталкиваемся с этой проблемой, если одно и то же задание выполняется во время локальной отладки кода или запуска его вне службы. В качестве основного отличия мы выяснили, что наша служба выполняет задание в своем собственном отдельном домене приложения. Логика создания этого домена приложения приведена ниже:
private AppDomain CreateAppDomain(string applicationName)
{
var uid = Guid.NewGuid();
var fi = new FileInfo(Assembly.GetExecutingAssembly().Location);
var info = new AppDomainSetup
{
ConfigurationFile = @"D:DeployAppweb.config",
ApplicationBase = @"D:DeployApp",
ApplicationName = applicationName,
CachePath = fi.Directory.Parent.FullName @"Temp",
ShadowCopyDirectories = @"D:DeployAppbin",
PrivateBinPath = "bin",
ShadowCopyFiles = "true"
};
var domain = AppDomain.CreateDomain(uid.ToString(), null, info);
return domain;
}
Это сводится к следующим строкам кода:
var domain = CreateAppDomain("DomainOfInstance1");
// Use thread info from the calling process
if (threadPrincipal != null)
{
domain.SetThreadPrincipal(threadPrincipal);
}
var tt = (LocalWindowsService)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(LocalWindowsService).FullName, false, BindingFlags.Default, null, null, null, null);
tt.OnThreadDone = LocalWindowsService_OnThreadDone;
id = tt.StartJob(id, parameters);
Debug.WriteLine(string.Format("started job: {0}", id));
И соответствующий код для выполнения пакета:
var ssisRunEventHandler = new SsisRunEventHandler(sqlObject, process);
Package.Execute(null, null, ssisRunEventHandler, null, null);
Если я вызываю задание с моего локального компьютера во время отладки или через пул приложений моего веб-приложения, размещенного в C:Windows.NET .. вместо того, чтобы D:DeployApp , я могу продолжать запускать SSIS столько раз, сколько захочу. Когда тот же код пакета.Выполнение выполняется через домен приложения, однако служба SSIS зависает при последующей проверке после повторного вызова execute для любого пакета SSIS.
Что мы обнаружили в качестве обходного пути, так это явный вызов AppDomain .Выгрузить (домен), чтобы предотвратить его замораживание, но мне кажется, что это хак — и что мы получаем исключения об исключениях выгрузки домена и прерывания потока, как следствие. Я надеялся попытаться разобраться в этом подробнее, но это просто выход за пределы моего домена, чтобы узнать, есть ли вообще инструменты, которые могут помочь мне понять, что застревает в службах интеграции, когда пакет запускается в отдельном домене. Ничто в средстве просмотра событий и / или наших собственных журналах также не сообщает ничего странного (у меня включено ведение журнала пакетов).
Кто-нибудь сталкивался с такой же проблемой и имеет рекомендации относительно того, какие инструменты, если таковые имеются, я могу использовать для устранения неполадок?
Не уверен, поможет ли это, но некоторые дополнительные детали: SQL Server DB — это службы интеграции 2016 года версии 13.0.0.0, использующие SQLNCLI11 для поставщика в нашей строке подключения к файлам с разделителями назначения в качестве наших источников