如何从 SSIS 服务器获取正在运行的包的集合

本文关键字:运行 集合 获取 SSIS 服务器 | 更新日期: 2023-09-27 18:35:08

启动 SSIS 包后,我尝试等到 SQL Server 上所有正在运行的包都完成,但我无法找出正确的方法。到目前为止,我的代码是:

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 并从目录中获取操作状态,但在这种情况下这是不可能的。

如何从 SSIS 服务器获取正在运行的包的集合

通过调用集成服务并获取新目录来解决它。这将自动刷新它:

// 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
}