Servlets 如何在liferay中以编程方式中断服务器请求
在导出到Excel文件时,用户需要能够停止当前的导出操作 在Liferay中有没有任何方法可以通过编程实现这一点 以下是预期情景:Servlets 如何在liferay中以编程方式中断服务器请求,servlets,liferay,Servlets,Liferay,在导出到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();
}
}