Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次调用Swing操作侦听器-超敏感_Java_Swing - Fatal编程技术网

Java 多次调用Swing操作侦听器-超敏感

Java 多次调用Swing操作侦听器-超敏感,java,swing,Java,Swing,我在JavaWebStart中的Swing应用程序中有一个简单的动作监听器(相信我,它99.99%的时间都工作得很好),可以从UI多次调用它。下面是一个场景 操作侦听器调用一个服务器端(EJB)方法来填充 数据库中的一些表 服务器端可能需要很长时间(最多1分钟)来处理 请求 动作侦听器只需调用后端一次 在99%的情况下(生产中),动作监听器的工作方式是 期望 有1%的情况下,后端方法被称为multiple 导致数据库中数据损坏的次数 尝试用2个UI模拟,用相同的调用后端 输入,但无法复制 我

我在JavaWebStart中的Swing应用程序中有一个简单的动作监听器(相信我,它99.99%的时间都工作得很好),可以从UI多次调用它。下面是一个场景

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

  • 操作侦听器多次调用后端方法(可能是双击)
  • 后端过载过多,无法保持线程完整性
我已经看到了浏览器中HTML按钮的多次单击操作,并使用javascript/jquery处理了它。Swing也有类似的超敏感度吗

我想使用Eclipse调试器来诊断线程问题,但不知道如何模拟这个场景。停止一个线程意味着整个进程无法启动另一个线程

无论如何,Swing应用程序都是超敏感的。它将有效负载传递给DB,但在1%的情况下,它会执行多次。我可以编写一些DB代码来过滤数据,但如果这是根本原因,我更喜欢Swing中的修复

我试图通过发送多次单击来重新创建Sikuli的bug场景 按按钮,但没有用。你能建议我一种方法来模拟这个可能的UI/线程错误场景,以便我可以应用相关的修复程序吗?这必须是可行的,因为Swing已经存在了几十年,很多遗留应用程序都使用Swing和EJB

我们将感激你的帮助

多谢各位

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

长时间运行的任务不应在
事件调度线程(EDT)
上执行。因此,我建议当您单击按钮时,您将:

  • 禁用按钮以指示它正在处理任务
  • 启动SwingWorker以在单独的线程上更新数据库
  • 当SwingWorker完成执行时,您将启用该按钮
  • 这将防止用户在任务运行时单击按钮两次


    阅读Swing教程中关于的部分,了解有关
    EDT
    SwingWorker
    的更多信息!这是一个快速的反应。如前所述,这是20年前Swing成为山中之王时编写的遗留代码。我可以照你说的做,但首先我需要一个用例。我无法复制几乎每天都在生产中发生的问题。我想我可以发布一个补丁并查看生产数据。但这是没有效率的。我不能重复这个问题。这也是我的问题。如果你对如何模拟奇数球的情况有任何想法,我将不胜感激。我已经用Sikuli参考更新了这个问题。基本上,使用Sikuli可以点击按钮。我选择发送双击,Swing应用程序只是忽略了它,并将其作为一次单击进行处理(可能是因为动作侦听器连接到鼠标单击事件)。所以我到了一个死胡同。我需要一个可复制的用例,这样我就可以向我上面的人演示并获得他们的批准来修复它,或者为此测试修复程序,让自己相信它是有效的。Thanksikuli可能发送双击的速度太快了。尝试发送一次点击,等待5秒钟,然后发送第二次点击。@GilbertLeBlanc我没有运气就实现了你的建议。有时后端进程返回得非常快(基于负载)。我尝试了50毫秒到5秒,但无法复制。对于我来说,它是如何在生产中几乎每天发生的仍然是一个谜。我认为这是基于负载。不知何故,启动两个线程来更新数据库中的同一行。我已经尝试在DB相关代码周围放置同步块。我在一个测试驱动的团队中。因此,如果我无法复制,则几乎不可能允许任何代码修复。。感谢您,我通过放置Thread.sleep来模拟重载,模拟了后端10秒的响应。用户界面冻结,直到服务器响应。这可能是因为执行的操作发生在@camickr所说的事件调度线程(EDT)中。