在运行时向批处理任务添加依赖关系

时间:2015-08-25 19:40:00

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

我在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();

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

我不确定我缺少什么,因为所有的任务都被成功执行,似乎只是依赖不想工作。

1 个答案:

答案 0 :(得分:2)

这些代码被称为重要的几件事。代码是否已批量生产?代码是在超级之前/之后在doBatch()中调用吗?等

你有一个选择,这会创建多个批处理任务吗?如果是,则需要在每个批处理任务对象上创建依赖关系。这是我看到的一个问题。如果你的while-select语句只选择1个记录并添加一个任务,那么问题就是其他问题,但是你不应该做一个选择来选择一个记录。

另外,您拨打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();