SysOperation Framework подавляет информационные сообщения для ReliableAsynchronous, но сохраняет их в истории пакетов
Я просто не могу справиться с инфраструктурой SysOperation, и у меня есть некоторые процессы ReliableAsynchronous, которые запускаются и вызывают info("starting...")
и т.п.
Я хочу эти сообщения infolog, чтобы, когда я смотрю в BatchHistory
Я могу видеть их в целях расследования позже.
Но они также запускаются для клиента, из партии. И я могу сказать, что они из партии, потому что вы не можете дважды щелкнуть по инфологам, чтобы перейти к источнику. Есть ли какой-либо способ подавить их появление на экране пользователя и показывать только в журнале пакетов?
РЕДАКТИРОВАТЬ с некоторым кодом: пользователь нажимает кнопку на панели действий формы, которая вызывает пункт меню действий, ссылающийся на класс.
В классе новый метод:
public void new()
{
super();
this.parmClassName(classStr(MyControllerClass));
this.parmMethodName(methodStr(MyControllerClass, pickTransLines));
this.parmExecutionMode(SysOperationExecutionMode::ReliableAsynchronous);
// This is meant to be running as a batch task, so don't load syslastvalue
this.parmLoadFromSysLastValue(false);
}
Основной метод попадания из пункта меню:
public static void main (Args _args)
{
MyControllerClass controller = new MyControllerClass();
MyContract contract;
WMSOrderTrans wmsOrderTrans;
RefRecId refRecId;
if (_args && _args.dataset() == tableNum(WMSOrderTrans) && _args.record())
{
contract = controller.getDataContractObject();
contract.parmRefRecId(_args.record().RecId);
controller.parmShowDialog(false);
refRecId = controller.doBatch().BatchJobId;
// This creates a batch tracking record
controller.updateCreateTracking(refRecId, _args.record().RecId);
}
}
Метод контроллера, который запускается:
// Main picking method
private void pickTransLines(MyContract_contract)
{
MyTrackingTable tracking;
boolean finished;
BatchHeader batchHeader = BatchHeader::getCurrentBatchHeader();
boolean updateTracking = false;
// NOTE - This infolog launches after a few seconds to the user, but
// you can't double click on the info message to go to the code
// because it's fired from the batch somehow.
info(strFmt("Working on wmsordertrans.recid == %1", _contract.parmRefRecId()));
// Create/Update batch tracker if needed
if (this.isInBatch())
{
// NOTE - This code gets executed so we ARE in batch
this.updateTrackingStuff(...);
}
// Do the pick work
finished = this.doPick(_contract);
if(!finished)
throw error("An error occurred during the picking process.");
}
Затем через доли секунды запускается моя сессия:
1 ответ
Посмотрите на SysOperationServiceController.afterOperation
метод,:
[...]
if (_executionMode == SysOperationExecutionMode::ReliableAsynchronous)
{
batch = this.operationReturnValue();
if (batch)
{
infolog.view(Batch::showLog(batch.RecId));
}
}
[...]
Это код, который показывает инфологию на экране для надежной асинхронной обработки.
Вы можете создать свой собственный контроллер, расширяя SysOperationServiceController
и использовать это в вашем пункте меню или в коде, так что сделайте это и перезаписать afterOperation
на вашем новом контроллере, например, вот так (не тестировал, но должен работать в вашем случае):
if (_executionMode != SysOperationExecutionMode::ReliableAsynchronous)
{
super(_executionMode, _asyncResult);
}