2014-12-24 123 views
0

我嘗試等待,直到所有運行的包都在SQL Server上完成後,我開始了一個SSIS包,但我無法弄清楚正確的方法來做到這一點。我到目前爲止的代碼是:如何從SSIS服務器獲取運行包的集合?

var runningPackagesBefore = catalog.Executions.ToList();  

// [..] logic to start the package 

while (true) 
{ 
    // get all packages that are new 
    catalog.Executions.Refresh(); 
    var newOperations = catalog.Executions.Except(runningPackagesBefore); 

    // get all packages that are new, running and are in the same folder and project as the package 
    var runningOperations = 
     newOperations.Where(
      operation => operation.FolderName == catalogFolder.Name 
       && operation.ProjectName == project.Name 
       && operation.Status == Operation.ServerOperationStatus.Running); 

    if (!runningOperations.Any()) 
    { 
     break; 
    } 

    // [..] sleep and timeout logic here 
} 

catalog.Executions.Refresh()調用導致死鎖有時問題。該文件還說「不要直接引用此方法...」。
需要刷新,因爲否則執行集合將被緩存並返回0個新事務。當它沒有死鎖運行時,它會正確返回正在運行的程序包數量。

所以我試圖找到一種方法,看看是否所有的軟件包都運行完畢。我正在運行的軟件包是一個「主」軟件包,用於啓動多個其他軟件包。否則,我可以簡單地獲取執行ID並從目錄中獲取操作狀態,但在這種情況下這是不可能的。

回答

0

通過回顧集成服務並獲取新目錄解決了這個問題。這會自動刷新它:

// get all executions for this project that are currently running 
var runningPackagesBefore = catalog.Executions.Select(operation => operation.Id).ToList(); 

// [..] logic to execute the package 

while (true) 
{ 
    var integrationServices = new IntegrationServices(sqlConnection); 
    Catalog refreshedCatalog = integrationServices.Catalogs[catalogName]; 

    // get all packages that are running 
    var runningOperations = refreshedCatalog.Executions.Where(
     operation => operation.Status == Operation.ServerOperationStatus.Running); 

    // get all packages that are new 
    var newRunningOperations = runningOperations.Where(
     operation => !runningPackagesBefore.Contains(operation.Id)); 

    if (!newRunningOperations.Any()) 
    { 
     break; 
    } 

    // [..] sleep and timeout logic here 
} 
相關問題