在运行时向批处理任务添加依赖项
Adding a dependency to a batch task at runtime
我在 AX 2012 R2 中有一个运行的批处理作业,本质上是迭代 table 并创建一个 class(扩展 RunBaseBatch)的实例作为任务添加。
在所有任务完成后,我还有一些post处理项目需要做。
到目前为止,以下方法有效:
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();
我的想法是,这将添加对 post 进程任务的依赖,直到我们在循环中添加的最后一个任务上完成或出错时才开始。我得到的是一个例外 "The dependency could not be created because task '' does not exist."
我不确定我错过了什么,因为所有添加的任务都已成功执行,似乎只是依赖项不想工作。
有几件事,调用这段代码的地方很重要。代码已经批量了吗? doBatch()
before/after 中调用的代码是super吗?等等
你有一段时间-select,这会创建多个批处理任务吗?如果是这样,那么您需要创建对 each 批处理任务对象的依赖。这是我看到的一个问题。如果你的 while-select 语句只有 selects 1 记录并添加了一个任务,那么问题是别的,但你不应该做 while-select 到 select一条记录。
还有,你打了两次batchHeader.save();
。我可能会删除第一个电话。我需要查看什么在实例化您的代码。
在你有 this.getCurrentBatchTask().RecId
的地方,根据你的代码是否是批处理,尝试用 BatchHeader::getCurrentBatchTask().RecId
替换它
将 batchHeader = this.getCurrentBatchHeader();
替换为 batchHeader = BatchHeader::getCurrentBatchHeader();
EDIT Try this code (fix whatever to make it compile)
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();
我在 AX 2012 R2 中有一个运行的批处理作业,本质上是迭代 table 并创建一个 class(扩展 RunBaseBatch)的实例作为任务添加。
在所有任务完成后,我还有一些post处理项目需要做。
到目前为止,以下方法有效:
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();
我的想法是,这将添加对 post 进程任务的依赖,直到我们在循环中添加的最后一个任务上完成或出错时才开始。我得到的是一个例外 "The dependency could not be created because task '' does not exist."
我不确定我错过了什么,因为所有添加的任务都已成功执行,似乎只是依赖项不想工作。
有几件事,调用这段代码的地方很重要。代码已经批量了吗? doBatch()
before/after 中调用的代码是super吗?等等
你有一段时间-select,这会创建多个批处理任务吗?如果是这样,那么您需要创建对 each 批处理任务对象的依赖。这是我看到的一个问题。如果你的 while-select 语句只有 selects 1 记录并添加了一个任务,那么问题是别的,但你不应该做 while-select 到 select一条记录。
还有,你打了两次batchHeader.save();
。我可能会删除第一个电话。我需要查看什么在实例化您的代码。
在你有 this.getCurrentBatchTask().RecId
的地方,根据你的代码是否是批处理,尝试用 BatchHeader::getCurrentBatchTask().RecId
将 batchHeader = this.getCurrentBatchHeader();
替换为 batchHeader = BatchHeader::getCurrentBatchHeader();
EDIT Try this code (fix whatever to make it compile)
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();