点击按钮时心跳停止/阻塞



情况简介:当单击Vaadin按钮时,Vaadin心跳评估在会话中被锁阻塞。当一个按钮动作的执行时间超过3个心跳间隔时,连接将丢失。

<<p>

短问题/strong>是否有办法保持心跳继续,即使按钮点击执行需要超过3心跳间隔?更详细的情况描述:在Vaadin 8.8.6应用程序中,我遇到了这种情况(相关代码似乎没有更改到14.6.9,甚至可能更高):

  • 应用程序中按钮点击的处理/执行通常在几秒钟内完成。
  • 在极少数情况下,有动作(文件导入/转换/导出)需要花费17分钟来执行(是的,这对于一个按钮来说很长,不,我无法预测,是的,用户等待17分钟是可以的)
  • 按钮返回后,应用程序显示它失去了与服务器的连接。("服务器连接丢失,试图重新连接…")

服务器关闭会话的原因是com.vaadin.server.communication.HeartbeatHandler没有收到心跳消息大约15分钟(=3x5分钟=3x心跳间隔)。

服务器在15分钟内没有收到心跳消息,因为在com.vaadin.server.SynchronizedRequestHandler.handleRequest(VaadinSession, VaadinRequest, VaadinResponse)中会话上有一个锁(对于心跳请求和执行请求的按钮,它是具有相同ID的相同对象)。

解决方案:将心跳间隔设置为10分钟,使按钮的执行时间范围为3x10 = 30分钟。

解决方案B:修改HeartbeatHandler类并通过重写方法handleRequest禁用会话锁定(并且也为UnsupportedBrowserHandler,SessionRequestHandlerVaadinService.findOrCreateVaadinSession这样做(这是我对改变感到不舒服的)):

@Override
public boolean handleRequest(VaadinSession session, VaadinRequest request,
VaadinResponse response) throws IOException {
if (!canHandleRequest(request)) {
return false;
}
// ## This is part of the relevant change
// session.lock();
try {
return synchronizedHandleRequest(session, request, response);
} finally {
// ## This is part of the relevant change
// session.unlock();
}
}

解决方案C:异步执行每个按钮。这似乎是很大的努力,因为有许多按钮在该应用程序。

:《Vaadin》中是否有更标准化的方式来保持心跳继续(并保持会话存活),即使有很少的按钮执行时间超过3倍默认心跳间隔(=3倍5分钟)?

正如Andre所说,解决方案C是正确的方法。我甚至不会称之为变通,但你只需要做的事情。同时注意,变通方法B是绝对错误的,会破坏东西。变通方法A,是的,心跳是可调节的,但不是为了这个目的。这通常是相反的需求,即缩短时间,使服务器更积极地删除被抛弃的UI,从而减少为它们保留的资源。

相关内容

  • 没有找到相关文章

最新更新