【问题标题】:Handling Acumatica timeout on API Invoke action处理 API 调用操作上的 Acumatica 超时
【发布时间】:2019-01-29 16:42:58
【问题描述】:

我在一个独立的应用程序中有代码,它调用 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;
    }

【问题讨论】:

  • 你到底什么时候超时? exportSFPReport 方法是什么 - 一个动作处理程序?
  • 意识到我在剪切和粘贴中遗漏了几行;编辑了上面的代码。是的,它是一个动作处理程序。
  • 建议使用 PXLongOperation.StartOperation 将您的操作包装在 Long 操作中,正如@SergRogovtsev 所说。在其他情况下,您也可以在浏览器中超时。

标签: acumatica


【解决方案1】:

这里的问题是您的操作是同步的,因此它试图在 Invoke 调用内完成(这对于长流程来说不是一件好事)。您必须通过在处理程序中使用 PXLongOperation.StartOperation 显式地使您的操作长时间运行,然后您的客户端代码应该可以正常工作,因为它已经处理了等待和检查。

【讨论】:

  • 那么,GetProcessStatus 将跟踪 LongOperation 何时完成?在生成报告之前,我无法继续使用我的应用程序代码。
  • 是的,GetProcessStatus会根据操作状态给你返回不同的状态,当你得到'Completed'时,你可以继续前进。
【解决方案2】:

我相信您遇到超时的原因是因为您发送请求和接收响应之间没有 TCP 通信。将 TCP KeepAlive 标志设置为 true,客户端将定期 ping 服务器以重置超时期限。

这将是最好的方法。但是 Acumatica 连接级别相当高,因此我认为您无法轻松访问该标志。在不涉及外部应用程序的场景中,我首先会尝试将您的操作事件处理程序代码包装在 PXLongOperation 块中,该块必须执行类似的操作以在后台保持连接:

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

当我在 Acumatica 中遇到无法通过 PXLongOperation 解决的超时时,我会选择最简单的方法,即在 Web.Config 文件中增加 IIS 超时。我不确定您使用外部应用程序的用例是否能与异步 PXLongOperation 配合使用。处理程序会过早返回,客户端无法检索异步负载。

因此,您可能不得不增加超时时间。据我所知,除非您的网站受到 DOS 攻击的威胁,否则这样做并没有真正的实际缺点。

如果您是自托管 Acumatica,您可以使用 inetmgr 程序查找和编辑 Acumatica 实例的 Web.Config 文件。否则,请与您的 SAAS 联系人联系,看看是否可以选择。

我很确定您遇到了 IIS 超时。在 5 分钟(默认的 300 秒值)后,一个警示标志将失去连接。您可以编辑 Web.Config 文件以增加 executionTimeout 值。如果您从 Acumatica API 请求大量数据,那么增加 maxRequestLength 也不是一个坏主意,因为这也是您在测试中错过并在现实生活场景中发生的常见故障原因:

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

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2021-07-02
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多