Servlets 如何在liferay中以编程方式中断服务器请求

Servlets 如何在liferay中以编程方式中断服务器请求,servlets,liferay,Servlets,Liferay,在导出到Excel文件时,用户需要能够停止当前的导出操作 在Liferay中有没有任何方法可以通过编程实现这一点 以下是预期情景: 用户单击“取消导出” 该操作已取消 我正在使用Liferay 6.2,对于Excel,我正在使用POI库 另外,导出操作向数据库发出多个请求,以便读取数据并将其写入excel文件(在循环中)。受我对 最大的问题是:会话不能通过附加线程进行序列化。但只要您不尝试序列化会话(例如在集群中),这就没有问题。受我对 最大的问题是:会话不能通过附加线程进行序列化。但是,只要您

在导出到Excel文件时,用户需要能够停止当前的导出操作

在Liferay中有没有任何方法可以通过编程实现这一点

以下是预期情景:

  • 用户单击“取消导出”
  • 该操作已取消
  • 我正在使用Liferay 6.2,对于Excel,我正在使用POI库

    另外,导出操作向数据库发出多个请求,以便读取数据并将其写入excel文件(在循环中)。

    受我对

    最大的问题是:会话不能通过附加线程进行序列化。但只要您不尝试序列化会话(例如在集群中),这就没有问题。

    受我对


    最大的问题是:会话不能通过附加线程进行序列化。但是,只要您不尝试序列化会话(例如在集群中),这就没有问题。

    这不是特定于Liferay或POI的。有趣的是:请求的哪一部分消耗的时间最多?数据库访问、excel生成还是循环?如果是数据库访问,我在这里的回答可能会有所帮助:。否则,您可以向线程发送一个中断事件,并在循环条件下检查。循环占用大部分时间,因为它对数据库进行了多次调用(每次调用最多需要1.2秒)。该线程将为实际用户而不是其他用户中断,不是吗?该线程是为实际请求而中断的。感谢您的回复,您能提供实现此行为的链接吗?我不知道如何在Liferay中实现这一点这不是Liferay或POI特有的。有趣的是:请求的哪一部分消耗的时间最多?数据库访问、excel生成还是循环?如果是数据库访问,我在这里的回答可能会有所帮助:。否则,您可以向线程发送一个中断事件,并在循环条件下检查。循环占用大部分时间,因为它对数据库进行了多次调用(每次调用最多需要1.2秒)。该线程将为实际用户而不是其他用户中断,不是吗?该线程是为实际请求而中断的。感谢您的回复,您能提供实现此行为的链接吗?我不知道如何在生活中做到这一点。谢谢你的回答,我会尝试这个解决方案并让你不断更新。谢谢你的回答,我会尝试这个解决方案并让你不断更新。
    public void export() {
      // Store the current thread in the HttpSession
      HttpSession httpSession = servletRequest.getSession()
      httpSession.setAttribute("exportThread", Thread.currentThread());
    
      try {
        // Run your export loop
        for (...) {
          if (Thread.interrupted()) {
            // Export was called
            return;
          }
    
          // Do your export
          ...
        }
    
      } finally {
        // Clear the session attribute, if it is still our thread
        if (httpSession.getAttribute("exportThread") == Thread.currentThread()) {
          httpSession.removeAttribute("exportThread");
        }
      }
    }
    
    public void cancel() {
      // Get the thread from the HTTP session
      HttpSession httpSession = servletRequest.getSession();
      Thread exportThread = (Thread) httpSession.getAttribute("exportThread");
      if (exportThread != null) {
        // Cancel the previous export
        exportThread.interrupt();
      }
    }