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);
}
Другие вопросы по тегам