Процесс работает нормально при просмотре экрана процесса, но не по автоматическому расписанию

У меня есть процесс, который я пытаюсь запланировать. Когда расписание запускается, я получаю следующую ошибку:

       Message: Error #199: You are not currently logged in.

Date/Time: 09/06/2015 10:20
Platform: 
Browser: 

Source: PX.Data
Target Site: Int32 GetCurrentCompany()
Stack Trace:    at PX.Data.PXDatabaseProviderBase.GetCurrentCompany()
   at PX.Data.PXDatabaseProviderBase.getCompanyID(String tableName, companySetting& setting)
   at PX.Data.PXDatabaseProviderBase.getRestriction(String table, String alias, Boolean mainRestriction, Boolean isRightJoin, Nullable`1 effectiveCid)
   at PX.Data.PXDatabaseProviderBase.alterText(String text, Int32 start, Int32 stop, Boolean isTopLevelQuery)
   at PX.Data.PXDatabaseProviderBase.alterText(String text, Int32 start, Int32 stop, Boolean isTopLevelQuery)
   at PX.Data.PXDatabaseProviderBase.Select(PXGraph graph, BqlCommand command, Int32 topCount, PXView view, PXDataValue[] pars)
   at PX.Data.PXGraph.ProviderSelect(BqlCommand command, Int32 topCount, PXView view, PXDataValue[] pars)
   at PX.Data.PXView.GetResult(Object[] parameters, PXFilterRow[] filters, Boolean reverseOrder, Int32 topCount, PXSearchColumn[] sorts, Boolean& overrideSort, Boolean& extFilter)
   at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows)
   at PX.Data.PXSelectBase`1.selectBound[Resultset](BqlCommand command, Boolean readOnly, PXGraph graph, Int32 startRow, Int32 totalRows, Object[] currents, Object[] pars)
   at PX.Data.PXSelectBase`1.select[Resultset](BqlCommand command, Boolean readOnly, PXGraph graph, Int32 startRow, Int32 totalRows, Object[] pars)
   at PX.Data.PXSelectReadonly`2.SelectWindowed[Resultset](PXGraph graph, Int32 startRow, Int32 totalRows, Object[] pars)
   at PX.Data.PXSelectReadonly`2.Select[Resultset](PXGraph graph, Object[] pars)
   at Exosoft.MP.MikePero.Graphs.RexApiMaint.GetCustomerByCD(String id)

Процесс работает нормально, когда я запускаю его через экран процесса, но не по автоматическому расписанию.

Ошибка происходит, когда я вызываю ниже ...

PXSelectReadonly<PX.Objects.AR.Customer, Where<PX.Objects.AR.Customer.acctCD, Equal<Required<PX.Objects.AR.Customer.acctCD>>>>.Select(this, id);

Граф и граф, который он вызывает для обработки, настраиваются на основе созданной мной настраиваемой таблицы. Я добавил CompanyID и другие поля аудита в настраиваемую таблицу. Так я это называю

public class SyncRexApiProcess : PXGraph<SyncRexApiProcess>
{

    public PXCancel<RexApiLogin> Cancel;
    public PXProcessing<RexApiLogin> RexApiLogins;

    public SyncRexApiProcess()
    {
        RexApiLogins.SetProcessCaption("Sync From Rex Api Login");
        RexApiLogins.SetProcessAllCaption("Sync From All Rex Api Logins");
        RexApiLogins.SetProcessDelegate<RexApiMaint>(
            delegate(RexApiMaint graph, RexApiLogin login)
            {
                graph.Clear();
                Func<Task> task = async () =>
                {
                    await graph.SyncAPIDataAsync(login);
                };
                task().Wait();

            });
    }

}

person GrayFoxNZ    schedule 09.06.2015    source источник
comment
опубликуйте свой код для лучшего понимания. Попробуйте прикрепить процесс к отладчику и выполнить расписание, чтобы можно было отладить код и найти проблему.   -  person Sin    schedule 10.06.2015
comment
трассировка стека и ошибка говорят о том, что каким-то образом возникла проблема с входом в систему. в опубликованной вами строке кода нет никаких проблем. Я считаю, что когда Acumcatica пытается выполнить его в отношении БД, идентификатор компании недоступен для графика. Используйте PX.Common.PXContext.GetSlot ‹int?› (SingleCompanyID); в непосредственном окне, чтобы найти компанию, вошедшую в систему в данный момент.   -  person Sin    schedule 10.06.2015
comment
PX.Common.PXContext.GetSlot ‹int?› (SingleCompanyID); возвращает ноль   -  person GrayFoxNZ    schedule 11.06.2015
comment
Хорошо, это означает, что проблема связана с сеансом входа в систему для этого конкретного графа, а не со строкой кода, упомянутой там.   -  person Sin    schedule 11.06.2015
comment
Пожалуйста, посмотрите выше мой код из графа процесса, вызывающий метод на другом моем графике. Какие соображения я должен сделать в отношении сеанса входа в систему, мне нужно сначала что-то инициализировать?   -  person GrayFoxNZ    schedule 11.06.2015
comment
Код выглядит нормально. так у вас проблема в RexApiMaint, обряд? Попробуйте использовать код без параллельной обработки задач, так как из моего предыдущего опыта у меня возникли проблемы при многопоточности.   -  person Sin    schedule 12.06.2015


Ответы (1)


Используя async / await, ваш код будет работать в другом потоке, который не гарантирует правильную инициализацию с помощью переменных сеанса. Я не верю, что Acumatica гарантирует какую-либо потокобезопасность графа или любого из кешей, поэтому вам следует отделить любой код, который взаимодействует с ним, от ваших асинхронных операций.

Более того, я не вижу смысла использовать асинхронную операцию; в этом случае это только усложнит вашу жизнь - просто запустите синхронизацию API из основного потока. Если вы хотите запустить несколько операций одновременно и дождаться их возврата, изолируйте эти операции от графа и кешей.

person Gabriel    schedule 12.06.2015