Vaadin UI Detached异常

3

我正在使用 Vaadin 7.7.10,并且在使用后台 Threads@Push 注解时,在日志中看到许多 UIDetachedExceptions

请建议如何正确释放资源以清除我的日志。


请展示一些与此相关的代码。您确定它们真的是问题,而不仅仅是用户留下的会话吗? - André Schild
2个回答

5
如果您在UI.access(..)中对已分离的UI进行操作,将会触发UIDetachedException。这是很自然的,例如,如果用户关闭了浏览器,或者网络上出现了一些关闭连接的情况,因此UI已经被分离。如果在您的情况下,UIDetachedException是由这些原因引起的,那么它是无害的。在这种情况下,您可以通过检查UI.isAttached()来避免在日志中生成垃圾,如果UI已经被分离,则返回false,如果UI已经被放入清理队列,则返回UI.isClosing()

1
这里提出的方法存在一个小问题。在您运行 ui.isAttached()ui.access(handler) 之间的时间段内,UI 可能会变得分离。您仍然可以解决大多数异常,但不是所有异常。 - Leif Åstrand
1
这是正确的。然而我在现实生活中并没有看到发生过这种情况。 - Tatu Lund
Component子类中通过重写com.vaadin.flow.component.Component#onDetach方法来执行清理操作是否也是可能的? - aboger

2
这是因为用户关闭了他们的浏览器窗口或标签,这意味着特定的UI实例不再使用。
通常最好的方法是在应用程序的UI子类中覆盖detach方法并在那里进行清理。只需记得调用super.detach()
另一种选择是捕获可能由UI.access抛出的UIDetachedException并在那时进行清理。这种方法的缺点是当UI被分离时,您不能立即收到通知,而只有在尝试对其进行操作时才会收到通知。
注意:在Vaadin 10及更高版本中,该方法的名称为onDetach而不是detach。在这些版本中,不建议子类化UI,而是使用内置实现并使用addDetachListener

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接