AX2009 批處理作業中使用多線程---批量捆綁
阿新 • • 發佈:2018-09-12
macro comm cas show 器) alt lock roc 情況
批量捆綁
由於Ax服務器中批處理線程是可以多個的,而實際批處理作業中線程往往只使用了一個
Class:
/* 批量捆綁 */
/*class Code*/
public class DemoBatchBundles extends RunBaseBatch { str 20 fromSalesOrder, toSalesOrder; #define.CurrentVersion(1) #localmacro.CurrentList fromSalesOrder, toSalesOrder #endmacro } public void new() { super(); } public container pack() { return [#CurrentVersion, #CurrentList]; } private void parmEndBlock( str _toSalesOrder) { toSalesOrder = _toSalesOrder; } private void parmStartBlock(str _fromSalesOrder) { fromSalesOrder= _fromSalesOrder; } void run() { SalesTable salesTable; SalesFormLetter formletter; Map SalesMap; ; info(fromSalesOrder+‘:‘+toSalesOrder); /* Each task knows the range of work items it needs to process. This range information is already packed when the task is created */ while select * from salesTable where salesTable.salesId >= fromSalesOrder && salesTable.salesId <= toSalesOrder && salesTable.documentStatus == DocumentStatus::none { formletter = SalesFormLetter::construct(DocumentStatus::Invoice); formletter.getLast(); formletter.resetParmListCommonCS(); formletter.allowEmptyTable(formletter.initAllowEmptyTable(true)); SalesMap = new Map(Types::Int64,Types::Record); SalesMap.insert(salesTable.recid,salesTable); // formletter.parmDataSourceRecordsPacked(SalesMap.pack()); // formletter.createParmUpdateFromParmUpdateRecord(SalesFormletterParmData::initSalesParmUpdateFormletter(DocumentStatus::Invoice, FormLetter.pack())); formletter.showQueryForm(false); formletter.initLinesQuery(); formletter.update(salesTable, systemDateGet(), SalesUpdate::All, AccountOrder::None, false, false); } } public boolean unpack(container packedClass) { Version version = RunBase::getVersion(packedClass); switch(version) { case #CurrentVersion: [version,#CurrentList] = packedClass; break; default: return false; } return true; } public static DemoBatchBundles construct(str _fromSalesOrder, str _toSalesOrder) { DemoBatchBundles c; ; c = new DemoBatchBundles(); c.parmStartBlock(_fromSalesOrder); c.parmEndBlock(_toSalesOrder); return c; }
Job 測試
/* Here tasks are created to process work items equivalent to the bundle size. The range between the fromSalesOrder and toSalesOrder is a bundle of work items. */ static void scheduleDemoBundlesJob(Args _args) { int blockSize=30; //My bundle size BatchHeader batchHeader; DemoBatchBundles demoBatchBundles; SalesTable salesTable; str fromSalesOrder, toSalesOrder; str lastSalesId; BatchInfo batchInfo; int Counter=0; SalesId _SalesIdFrom,_SalesIdTo; ; _SalesIdFrom = "SSO000001"; _SalesIdTo = "SSO001000"; ttsBegin; select count(RecId) from salesTable where salesTable.salesId >= _SalesIdFrom && salesTable.salesId <= _SalesIdTo && salesTable.documentStatus == DocumentStatus::none; info(Strfmt("%1",salesTable.recid )); if (salesTable.recid > 0) { batchHeader = BatchHeader::construct(); batchHeader.parmCaption(strFmt(‘Batch job for DemoBundlesBatch Invoice SalesOrders %1 thru %2‘, ‘SO-00400001‘, ‘SO-00500000‘)); while select salesid from salesTable order by salesTable.SalesId where salesTable.salesId >= _SalesIdFrom && salesTable.salesId <= _SalesIdTo && salesTable.documentStatus == DocumentStatus::none { Counter += 1; if (Counter ==1) { fromSalesOrder = salesTable.salesid; } if (Counter == blockSize) { toSalesOrder = salesTable.salesid; /* Each task is created to process a bundle of work items (in this case a range of sales Orders)*/ demoBatchBundles = DemoBatchBundles::construct(fromSalesOrder, toSalesOrder); info(fromSalesOrder+‘ : ‘ + toSalesOrder); batchInfo = DemoBatchBundles.batchInfo(); BatchInfo.parmCaption(fromSalesOrder+‘ : ‘ + toSalesOrder); batchInfo.parmGroupId("COUNTING"); batchHeader.addTask(demoBatchBundles); Counter = 0; } lastSalesId = salesTable.SalesId; } // This is to handle the spillover // #SalesOrders in this last bundle will be less than the bundle size if (Counter > 0) { toSalesOrder = lastSalesId; demoBatchBundles = DemoBatchBundles::construct( fromSalesOrder, toSalesOrder); info(fromSalesOrder+‘ : ‘ + toSalesOrder); batchInfo = DemoBatchBundles.batchInfo(); BatchInfo.parmCaption(fromSalesOrder+‘ : ‘ + toSalesOrder); batchInfo.parmGroupId("COUNTING"); batchHeader.addTask(demoBatchBundles); } batchHeader.save(); } ttsCommit; info(‘Done‘); } /* 批量捆綁 假設,我們處理10萬條記錄 #已創建任務 #批處理線程(在我的測試服務器) #可並行執行的並行任務 100 10 10 前10個任務完成後,批處理框架將加載下10個任務並執行,以此類推; 在這種情況下,可能需要加載10次或更多次。 */
AX2009 批處理作業中使用多線程---批量捆綁