【问题标题】:Adding a dependency to a batch task at runtime在运行时向批处理任务添加依赖项
【发布时间】:2015-08-27 00:52:57
【问题描述】:

我在 AX 2012 R2 中有一个批处理作业,它运行,本质上是迭代一个表并创建一个作为任务添加的类的实例(扩展 RunBaseBatch)。

在所有任务完成后,我还有一些后期处理项目需要做。

到目前为止,以下是有效的:

while select stagingTable where stagingTable.OperationNo == params.paramOperationNo()
{
    batchHeader = this.getCurrentBatchHeader();
    batchTask = OperationTask::construct();
    batchHeader.addRuntimeTask(batchTask,this.getCurrentBatchTask().RecId);

}

batchHeader.save();
postTask = PostProcessingTask::construct();
batchHeader.addRuntimeTask(postTask,this.getCurrentBatchTask().RecId);
batchHeader.addDependency(postTask,batchTask,BatchDependencyStatus::FinishedOrError);
batchHeader.save();

我的想法是,这将增加对后期处理任务的依赖,直到我们在循环中添加的最后一个任务完成或错误时才开始。我得到的是一个异常“无法创建依赖项,因为任务''不存在。”

我不确定我错过了什么,因为所有添加的任务都已成功执行,似乎只是依赖项不想工作。

【问题讨论】:

    标签: batch-processing axapta dynamics-ax-2012


    【解决方案1】:

    有几件事,这段代码被称为很重要。代码已经批量了吗?代码是在超级之前/之后调用doBatch() 吗?等等

    您有一个 while-select,这会创建多个批处理任务吗?如果是这样,那么您需要创建对 each 批处理任务对象的依赖关系。这是我看到的一个问题。如果您的 while-select 语句只选择了 1 条记录并添加了一项任务,那么问题出在其他地方,但您不应该执行 while-select 来选择一条记录。

    另外,您拨打batchHeader.save(); 两次。我可能会删除第一个电话。我需要看看是什么在实例化您的代码。

    this.getCurrentBatchTask().RecId 所在的位置,取决于您的代码是否是批处理的,请尝试将其替换为 BatchHeader::getCurrentBatchTask().RecId

    你有 batchHeader = this.getCurrentBatchHeader(); 的地方替换为 batchHeader = BatchHeader::getCurrentBatchHeader();

    编辑试试这个代码(修复任何让它编译的东西)

    BatchHeader     batchHeader = BatchHeader::getCurrentBatchHeader();
    Set             set         = new Set(Types::Class);
    SetEnumerator   se;
    BatchTask       batchTask;
    PostTask        postTask;
    
    while select stagingTable where stagingTable.OperationNo == params.paramOperationNo()
    {
        batchTask = OperationTask::construct();
        set.add(batchTask);
        batchHeader.addRuntimeTask(batchTask,BatchHeader::getCurrentBatchTask().RecId);
    }
    
    // Create post task
    postTask = PostProcessingTask::construct();
    batchHeader.addRuntimeTask(postTask,BatchHeader::getCurrentBatchTask().RecId);
    
    // Create dependencies
    se = set.getEnumerator();
    while (se.moveNext())
    {
        batchTask = se.current(); // Task to make dependent on    
        batchHeader.addDependency(postTask,batchTask,BatchDependencyStatus::FinishedOrError);
    }
    
    batchHeader.save();
    

    【讨论】:

    • 另外,batchTask 是在while select 中构造的,这意味着如果您的临时表中没有记录,您将得到一个空异常。
    • 在执行的这一点上,我已经验证了暂存表包含数据。这段代码在我们收到 AIF 服务请求后运行。 AIF 服务使用 SysOperationFramework 创建要运行的任务。反过来,该任务执行上面发生的事情
    • 我帖子中的其他 cmets 怎么样? while 循环是否选择了多个记录?多次调用.save(),替换为BatchHeader::getCurrentBatch[...]?
    • 刚刚尝试过,将 PostProcessing 任务的创建移动到第一个循环迭代中(使用快速布尔值),然后每次添加依赖项,并将该依赖项添加到每个任务(循环可以创建1 到许多任务,在这个测试用例中,它将是 11),同样的异常
    • 在循环内部,如果您创建 10 个任务,并且每个任务,您创建 1 个依赖于 batchTask 的后处理任务,您理解这意味着创建了 1 个 batchTask 和 1 个 postTask同时彼此依赖。因此,您将有 10 对任务,它们是 1-1 和 1-1 和 1-1 相互依赖的。如果您希望在所有 batchTasks 完成后启动所有 post 任务,您需要使每个 post 任务依赖于每个 batch 任务。创建一个Set set = new Set(Types::Class),并用创建的batchTasks 填充它,然后循环该集合
    猜你喜欢
    • 2017-05-20
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多