【问题标题】:Swing Action Listener Called Multiple Times - Hyper Sensitive多次调用 Swing 动作侦听器 - 超敏感
【发布时间】:2020-06-23 01:53:23
【问题描述】:

我在 Java Web Start 的 Swing 应用程序中有一个简单的动作侦听器(相信我,它在 99.99% 的情况下都能正常工作),它会从 UI 中被多次调用。这是场景

  • 动作侦听器调用服务器端 (EJB) 方法,该方法填充 数据库中的一些表
  • 服务器端可能需要很长时间(最多 1 分钟)来处理
    请求
  • 动作监听器只需要调用一次后端
  • 在 99% 的情况下(在生产中),动作侦听器的工作方式为
    预计
  • 有 1% 的情况会调用多个后端方法
    导致数据库中数据损坏的次数
  • 试图模拟 2 个 UI 调用后端相同
    输入,但无法复制

我认为可能有两个假设

  • 动作监听器多次调用后端方法(可能是双击)
  • 后端过载,无法维持线程完整性

我已经看到浏览器中 HTML 按钮的多次单击操作,并使用 javascript/jquery 处理它。 Swing 有类似的超敏感度吗?

我想使用 Eclipse 调试器来诊断线程问题,但不知道如何模拟这种情况。停止一个线程会导致整个事情无法启动另一个线程。

无论如何,Swing 应用程序是非常敏感的,如果有的话。它确实完成了将有效负载传递到数据库的工作,但在 1% 的情况下它会执行多次。我可以编写一些数据库代码来过滤数据,但如果这是根本原因,我更喜欢在 Swing 中进行修复。

我尝试通过发送多次点击来重新创建 Sikuli 的错误场景 到按钮但徒劳无功。您能否建议我一种方法来模拟这种可能的 UI/线程错误场景,以便我可以应用相关修复?这必须是可行的,因为 Swing 已经存在了几十年,而且许多遗留应用程序都使用 Swing 和 EJB。

感谢您的帮助。

谢谢

【问题讨论】:

    标签: java swing


    【解决方案1】:

    动作侦听器调用服务器端 (EJB) 方法,该方法填充数据库中的一些表

    不应在Event Dispatch Thread (EDT) 上执行长时间运行的任务。所以我建议当你点击你的按钮时,你会:

    1. 禁用按钮以表明它正在处理任务
    2. 启动 SwingWorker 以在单独的线程上更新数据库。
    3. 当 SwingWorker 完成执行时,您启用该按钮。

    这将防止用户在任务运行时单击按钮两次。

    阅读 Concurrency 上的 Swing 教程部分,了解有关 EDT 和 SwingWorker 的更多信息。

    【讨论】:

    • 哇!那是一个快速的反应。如前所述,它是 20 年前编写的遗留代码,当时 Swing 是山中之王。我可以照你说的做,但首先我需要一个用例。我无法复制生产中几乎每天都在发生的问题。我想我可以推出一个修复程序并观察生产数据。但效率不高。我无法复制这个问题。那也是我的问题。如果您对如何模拟奇数球案有任何想法,我将不胜感激。
    • 我已经更新了 Sikuli 参考的问题。基本上使用 Sikuli 可以发送点击按钮。我选择发送双击,而 Swing 应用程序只是忽略它并将其作为单击处理(可能是因为动作侦听器附加到鼠标单击事件)。所以我遇到了死胡同。我需要一个可重现的用例,这样我就可以向我上面的人展示并获得他们的批准来修复它,或者测试修复以说服自己它有效。谢谢
    • Sikuli 发送双击的速度可能太快了。尝试发送一次点击,等待 5 秒,然后发送第二次点击。
    • @GilbertLeBlanc 我没有运气就实施了您的建议。有时后端进程返回非常快(基于负载)。我尝试了 50 毫秒到 5 秒,但无法重现。对我来说,它在生产中是如何几乎每天都发生的仍然是个谜。我认为这是基于负载。不知何故,两个线程被启动以更新数据库中的同一行。我尝试在数据库相关代码周围放置同步块。我在一个测试驱动的团队中。因此,如果我无法重现,则几乎不可能允许任何代码修复。谢谢
    • FWIW,我通过放置 Thread.sleep 来模拟重负载,模拟了来自后端的 10 秒响应。 UI 冻结,直到服务器响应。这可能是因为正如@camickr 所说,所执行的操作是在事件调度线程 (EDT) 中发生的。
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2013-04-17
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多