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