【问题标题】:Graceful handling of server timeout in BlazeDS在 BlazeDS 中优雅地处理服务器超时
【发布时间】:2010-09-21 20:25:06
【问题描述】:

我有一个 flex 客户端,它对运行 BlazeDS 的 tomcat 服务器进行服务调用。我想在这个环境中优雅地处理服务器会话超时。

我确实对服务有安全限制,因此客户端通过基于目标初始化 ChannelSet 来针对远程对象进行身份验证,然后使用该 ChannelSet 登录。

用户通过身份验证后,如果他们去喝一杯(长)杯咖啡,他们的会话将不可避免地超时。

我希望客户端检测到超时,并将用户返回到登录页面,并带有适当的信息消息。

但我很难找到从客户端检测此超时的最佳方法。是否有可能,或者我必须让服务器在超时发生时抛出错误?

谢谢!

【问题讨论】:

    标签: apache-flex blazeds


    【解决方案1】:

    扩展 CallResponder,并覆盖故障方法。

    检查 data.fault.faultCode 以获取已知错误代码,例如 ErrorMessage.MESSAGE_DELIVERY_IN_DOUBT。

    如果命中,请使用本机函数 navigateToURL 进行重定向。

    【讨论】:

      【解决方案2】:

      这不是 BlazeDS 特有的,但从 Flex 4.5(可能更早)开始,对于超时错误的故障事件有一个特定的故障代码:

      在您的故障处理程序中:

      if(faultEvent.fault.faultCode == "Client.Error.RequestTimeout"){
        trace("TIMEOUT ERROR");
      }
      

      【讨论】:

        【解决方案3】:

        我们实现了一个自定义 UI 服务,它不断地 ping 服务器(每 10 分钟 1 个 ping),从而防止 AppServer 关闭连接。我们还运行一些内部 UI 计时器,每次发出任何请求(“ping”除外)时都会丢弃该计时器,并使用完整的函数调用 UI 以切换回登录并显示“由于客户端不活动而导致会话过期”。

        【讨论】:

          【解决方案4】:

          在服务器端实现 FlexSessionListener 接口。它提供了一种在 Flex 会话实际完成之前处理它们创建/销毁的方法。

          在 sessionDestroyed 处理程序上,使用消息生产者从服务器向客户端发送消息,让他知道会话即将超时。

          【讨论】:

          • 问题在于 FlexSession 和 FlexClient 抽象类只公开了一种静态方式来监听会话/客户端创建事件。查看代码,destroy listeners 的集合并没有以相同的静态方式存储,因此即使重写类也不会提供一种简单的方法来做到这一点。在我看来,他们天真地为 BlazeDS API 的最终用户提供了一种在服务器上执行此操作的简单方法
          【解决方案5】:

          我在我的一个项目中遇到了这个问题。为了克服这个问题,我每次客户端访问服务器时,无论是通过 RemoteObject 还是 HTTPService,它都会首先检查用户的身份验证,如果它已经超时,它会返回一些东西,如果它很好,它将继续它的过程。在客户端的响应处理程序结果事件中,客户端检查响应是否超时,如果是,它将再次转发到登录页面。 据我所知,当用户的会话超时时,服务器不会向客户端抛出错误。您只会在下次访问服务器时知道会话超时。

          【讨论】:

            【解决方案6】:

            我们为客户端编写了一个自定义组件,用于捕获击键和鼠标事件,然后在客户端处理超时。

            【讨论】:

            • 无法在客户端检测超时,因此这是理想的解决方案。如果您将客户端上的超时设置为略小于服务器,这将非常有效。
            【解决方案7】:

            我在一个项目中遇到了这个问题,特别是因为 BlazeDS 的会话超时与实际应用程序不同(通过 ClearTrust 使用单点登录架构)。请注意,这是在 JBoss 环境中。我最终采取了一种相当简单的方法,在故障处理程序中查找 2 个特定的故障代码(有一个带有通用故障处理程序的基类):DuplicateSessionDetected 和 DeliveryInDoubt。每当 BlazeDS 尝试为相同的 JBoss 会话 ID 创建新会话时,我都会看到 DuplicateSessionDetected。 DeliveryInDoubt 有时也会出现,但我不知道为什么。当我看到这些故障代码时,我采取了必要的措施来刷新应用程序(根据您的需要,您可以重定向到登录页面或其他内容)。显然,根据环境,您可能需要侦听不同的故障代码,并且这种方法可能不适用于给定不同的环境/配置/等的每种情况。

            讨论过的另一种方法是在 Flex 应用程序中使用一个计时器来表示 BlazeDS 超时计时器,但我不喜欢为此目的设置计时器。我还听说过向服务器来回发送少量数据以检查超时,但同样,这似乎不太理想。

            【讨论】:

            • 你使用的是什么版本的 BlazeDS?
            【解决方案8】:

            查看文档,看看连接断开时是否触发了事件。我想有。如果没有,请在您的连接周围使用 try/catch 并捕获任何与连接相关的问题。如果这样做,请重定向您的应用并通知用户。您可能需要使用它来查找因连接问题而引发的确切错误代码,但调试起来应该相当容易。

            【讨论】:

              猜你喜欢
              • 2015-05-15
              • 2015-03-05
              • 2013-10-17
              • 1970-01-01
              • 2019-01-15
              • 2018-11-10
              • 2011-08-08
              • 1970-01-01
              • 2012-07-09
              相关资源
              最近更新 更多