#windows-services #ssis #windows-server-2008
#windows-службы #ssis #windows-server-2008
Вопрос:
Я создал службу Windows, которая выполняет пакет SSIS каждые пять минут. Это работает довольно хорошо, но что-то сбивает его с толку.
Каждую неделю сервер перезапускается, и после перезапуска Служба перестает работать. События для запуска / завершения выполнения пакета SSIS по-прежнему отображаются в средстве просмотра событий, но пакет работает не так, как должен. Когда я вручную запускаю / останавливаю службу, все снова работает в обычном режиме.
Я что-то упускаю из виду, что я должен делать с Pacakge
?
Я использую веб-сервис, чтобы получить местоположение пакета SSIS. Я удалил большую часть этого из приведенного ниже кода, но оставил достаточно, чтобы структура моей службы была сохранена.
Вот суть моего кода:
namespace MyService
{
partial class MyService : ServiceBase
{
private Timer timer;
private Package pkg;
bool executing;
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
executing = false;
TimerCallback callback = new TimerCallback(Init);
int period = 1000 * 60; //attempt to initialize every minute.
timer = new Timer(callback, null, 0, period);
}
private void Init(object state)
{
try
{
//Get `timeIntervalMinutes` from Parameters table
string mySQLStatement = "...";
DataSet ds = mySQLQuery(...);
int timeIntervalMinutes = Convert.ToInt32(ds.Tables["timeIntervalMinutes"].Rows[0]["Value"]);
//Get `path` from Parameters table
string mySQLStatement = "...";
DataSet ds = mySQLQuery(...);
string path = Convert.ToString(ds.Tables["path"].Rows[0]["Value"]);
//Get `path` from Parameters table
string mySQLStatement = "...";
DataSet ds = mySQLQuery(...);
string server = Convert.ToString(ds.Tables["server"].Rows[0]["Value"]);
//Load the SSIS Package
Application app = new Application();
pkg = app.LoadFromDtsServer(path, server, null);
//If this line is reached, a connection to MyWS has been made, so switch the timer to run the SSIS package
timer.Dispose();
TimerCallback callback = new TimerCallback(OnTimedEvent);
int period = 1000 * 60 * timeIntervalMinutes;
timer = new Timer(callback, null, 0, period);
}
catch (Exception e)
{
return;
}
}
private void OnTimedEvent(object state)
{
if (!executing)
{
executing = true;
DTSExecResult pkgResults = pkg.Execute();
executing = false;
}
}
protected override void OnStop()
{
}
//<MyWS is here>
}
}
Спасибо за помощь!
Ответ №1:
Возможно, ваша служба или процесс зависят от другой службы — скажем, MSDTC. ЕСЛИ эта служба не будет готова так быстро после запуска, вы можете получить непредсказуемые результаты. Либо отложите запуск вашей службы, либо выясните зависимость и установите ее в свойствах службы