Exploring Batch Job process in Dynamics Ax 2012
There are many scenarios where we have to schedule the tasks, so they execute in
background. Real world scenarios are
§ Sales order with certain criteria will update status to Invoiced.
§ Scheduled job check the file location to find comma delimited files and
after finding create sales order or purchased orders in Ax.
§ Schedule job clear the data in database logging after certain time.
§ Schedule job execute mid night to extract all sales order/ Purchase
order and integrated it other system.
In dynamics Ax we can schedule the with help of
RunBaseBatch framework.
For current example, I just wrote the batch job
which just put its execution time in custom table.
First step for batch process is to enable the
Dynamics Ax 2012 as Batch server.
Consider a custom table with only two fields. These
fields just dummy text and the time when batch process execute.
Now just create a class, set it run at server.
Extends the class with run batch base class.
The class logic should be same
class ProcessTableIncrement extends RunBaseBatch
{
}
public container pack()
{
return conNull();
}
public void run()
{
// The purpose of your job.
TblBatchHit _hit;
_hit.HitBy ="BatchJob";
_hit.hitTime= DateTimeUtil ::utcNow();
_hit.insert();
}
public boolean unpack(container packedClass)
{
return true;
}
Now compile the code and Generate Increment CIL.
Incremental CIL generation is required to setup every time you update the code.
Now create ax job which deploy above class as
batch Process job.
static void TestBatchHit(Args
_args)
{
BatchHeader header;
SysRecurrenceData sysRecurrenceData;
Batch batch;
BatchJob batchJob;
ProcessTableIncrement _ProcessIncrement;
BatchInfo processBatchInfo;
BatchRetries noOfRetriesOnFailure = 4;
;
// Create the tutorial_RunBaseBatch
job, only if one does not exist
select batch where batch.ClassNumber == classnum(ProcessTableIncrement);
if(!batch)
{
// Setup the tutorial_RunBaseBatch
Job
header = BatchHeader::construct();
_ProcessIncrement = new ProcessTableIncrement();
processBatchInfo = _ProcessIncrement.batchInfo();
processBatchInfo.parmRetriesOnFailure(noOfRetriesOnFailure);
processBatchInfo.parmCaption("Table
Increment");
header.addTask(_ProcessIncrement);
// Set the recurrence data
sysRecurrenceData =
SysRecurrence::defaultRecurrence();
SysRecurrence::setRecurrenceStartDateTime(sysRecurrenceData,
DateTimeUtil::addSeconds(DateTimeUtil::utcNow(), 20));
SysRecurrence::setRecurrenceNoEnd(sysRecurrenceData);
SysRecurrence::setRecurrenceUnit(sysRecurrenceData,
SysRecurrenceUnit::Minute);
header.parmRecurrenceData(sysRecurrenceData);
// Set the batch alert configurations
header.parmAlerts(NoYes::No, NoYes::Yes, NoYes::No,
NoYes::Yes, NoYes::Yes);
header.save();
// Update the frequency to run the
job to every two minutes
ttsbegin;
select forupdate batchJob
join batch
where batchJob.RecId == batch.BatchJobId
&& batch.ClassNumber == classnum(ProcessTableIncrement);
sysRecurrenceData = batchJob.RecurrenceData;
sysRecurrenceData = conpoke(sysRecurrenceData,
8, [3]);
batchJob.RecurrenceData = sysRecurrenceData;
batchJob.update();
ttscommit;
}
}
When you execute the X++ job, you will find a new
batch job created and waiting state at following link with caption Table
Increment
From top menu you can check the job execution
history.
If any error occur or you put some info logs, these
can be seen from Log from top menu.
For example in some other batch job I used many
info boxes at different locations to trace.
Remove / Delete the batched job.
Delete the existing job is two-step process if job
is in waiting step. First we have to convert it into withhold state and then
delete it.
Select the required batch job for example if I want
to delete Job with caption “Table Increment”. From top menu to select change
state to with hold
Now again go in Functions top menu and select
Now from dialog set status to withhold and click on
ok
This will remove the Batch Job
Debug the Batch Process Job
Now question is how we can debug batch job, for
that purpose we have to go in visual studio.
For debugging at AOS server following check box
must be check form AOS server configuration.
“Enable breakpoints to debug x++ code running on
this server on this machine”
If Client and AOT are in same machine then open the
Application explore and locate the file and attach debug there.
If files are at AOS is another machine go at XPPIL
folder in visual studio and add break point.
From debug menu click on attached process
From Attach to select the manage code.
From top click on select button and select the
Managed(v4.0) code
Check the two check boxes below “Show Processes
from All Users and show processes in all sessions and click on refresh.
After refresh select Ax32Serv.exe and click on
attach button.
When the job execute after certain time link
appear on break point.
Comments
Post a Comment