Обработка тайм-аута Acumatica в действии API Invoke - PullRequest
0 голосов
/ 29 января 2019

У меня есть код в автономном приложении, которое вызывает действие Acumatica для генерации отчетов;Я сталкиваюсь с таймаутами на больших документах, пока действие завершается.

Как лучше всего справиться с этими таймаутами?Мне нужно дождаться завершения действия, чтобы получить сгенерированные мной файлы.

Код автономного приложения:

public SalesOrder GenerateAcumaticaLabels(string orderNbr, string reportType)
    {
        SalesOrder salesOrder = null;
        using (ISoapClientProvider clientProvider = soapClientFactory.Create())
        {               
            try
            {
                SalesOrder salesOrderToFind = new SalesOrder
                {
                    OrderType = new StringSearch { Value = orderNbr.Split(OrderSeparator.SalesOrder).First() },
                    OrderNbr = new StringSearch { Value = orderNbr.Split(OrderSeparator.SalesOrder).Last() },
                    ReturnBehavior = ReturnBehavior.OnlySpecified,
                };

                salesOrder = clientProvider.Client.Get(salesOrderToFind) as SalesOrder;                   

                InvokeResult invokeResult = new InvokeResult();                 
                invokeResult = clientProvider.Client.Invoke(salesOrder, new exportSFPReport());
                ProcessResult processResult = clientProvider.Client.GetProcessStatus(invokeResult);
                //Wait for the update to complete before we attempt to retrieve the files
                while (processResult.Status == ProcessStatus.InProcess)
                {
                    Thread.Sleep(1000); //pause for 1 second
                    processResult = clientProvider.Client.GetProcessStatus(invokeResult);
                }
            }

И действие в Acumatica:

    public PXAction<SOOrder> ExportSFPReport;
    [PXButton]
    [PXUIField(DisplayName = "Generate Robot SFP PDF")]
    protected IEnumerable exportSFPReport(PXAdapter adapter)
    {
        //Report Paramenters
        Dictionary<String, String> parameters = new Dictionary<String, String>();
        parameters["SOOrder.OrderType"] = Base.Document.Current.OrderType;
        parameters["SOOrder.OrderNbr"] = Base.Document.Current.OrderNbr;

        IEnumerable reportFileInfo = ExportReport(adapter, "IN619217", parameters);
        exportTrayLabelReport(adapter, "SFP");
        return reportFileInfo;
    }

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Проблема здесь в том, что ваше действие является синхронным, поэтому оно пытается завершиться в вызове Invoke (что не подходит для длительных процессов).Вы должны явно сделать вашу операцию длительной, используя PXLongOperation.StartOperation внутри вашего обработчика, и тогда ваш клиентский код должен работать должным образом, так как он уже обрабатывает ожидание и проверку.

0 голосов
/ 30 января 2019

Я полагаю, что причина возникновения тайм-аута в том, что между отправкой запроса и получением ответа нет связи по протоколу TCP.Если для флага TCP KeepAlive установлено значение true, клиент будет периодически пинговать сервер, чтобы сбросить период ожидания.

Это будет наилучшим способом.Однако соединения Acumatica довольно высокого уровня, поэтому я не думаю, что вы сможете легко получить доступ к этому флагу.Сначала я попробую в сценарии, в котором не задействовано внешнее приложение, обернуть код обработчика событий действия в блок PXLongOperation, который должен выполнить нечто подобное, чтобы поддерживать соединение под капотом:

PXLongOperation.StartOperation(this or Base, delegate
{
    your code here
});

Когда я сталкиваюсь с тайм-аутами в Acumatica, которые не могут быть решены с помощью PXLongOperation, я выбираю самый простой способ - увеличение тайм-аута IIS в файле Web.Config.Я не уверен, что ваш вариант использования с внешним приложением будет хорошо работать с async PXLongOperation.Обработчик вернется преждевременно, и клиент не сможет получить асинхронную полезную нагрузку.

Так что вам, возможно, придется увеличить время ожидания.Насколько я знаю, нет практического недостатка в этом, если только ваш сайт не находится под угрозой DOS-атак.

Вы можете найти и отредактировать файл Web.Config вашего экземпляра Acumatica, используя программу inetmgr, если выявляются хостингом Acumatica.В противном случае поговорите с вашим контактом SAAS, чтобы узнать, так ли это.

Я почти уверен, что у вас истекло время ожидания IIS.Контрольный знак будет разорван через 5 минут, что является значением по умолчанию 300 секунд.Вы можете редактировать файл Web.Config для увеличения значения executionTimeout.Также неплохо увеличить maxRequestLength, если вы запрашиваете большой объем данных у API Acumatica, так как это также распространенная причина сбоя, который вы пропускаете при тестировании и возникает в реальных сценариях:

<httpRuntime executionTimeout="300" requestValidationMode="2.0" maxRequestLength="1048576" />
...