2011-09-20 50 views
0

我是新来的泽西,jsp的和一般的Web应用程序开发,所以希望这不是一个愚蠢的问题。我有一个jsp,当用户点击一个按钮时,它会启动一个HTTP请求,大约需要5-10分钟才能返回。一旦完成,他们会被重定向到另一个页面。多线程一个jsp?

我想知道,是否有可能,甚至可取,我多线程应用程序,以便重处理将开始,但用户被重定向到下一个.jsp马上。如果多线程无法实现,那么您会推荐另一种方法来处理Web应用程序中的繁重处理?

回答

3

一个JSP基本上是一个Servlet(它被翻译成一个Java Servlet Class并编译)。特别是你可以在一个servlet中启动一个新的线程(因此在一个JSP中,通过scriptlet),但是由于多种原因,并不建议这么做。

建议通过ajax进行异步HTTP调用,然后,一旦调用完成后立即向用户显示其他内容,并在回调返回时显示结果。

1

您可以创建一个TimerTask(或Quartz Job)并将其设置为立即执行并将用户重定向到某个其他页面,而不是等待JSP中的进程完成。让那个Job把结果存储在一个可以被另一个JSP访问的中心位置(如果你想稍后拉取Job的结果,可能会通过ajax)。这样做可以节省你手动管理线程的难度(这很容易出错) ,你会得到异步功能,用户不需要看5-10分钟左右的空白浏览器屏幕。

0

这是可能的。

创建一个线程,将其引用存储在任何地方(静态地图)并存储其密钥(在会话中,在JSP的答案的代码中)。

以下调用可以检索线程并检查其状态/结果。

不管怎样,小心使用:

a)您将需要控制旧的结果将被删除。浏览器有时会关闭,这是不可避免的,所以你需要一个看门狗清除显然不再需要的数据。

b)用户不习惯这种行为。他们很可能会“回头”并尝试重新启动线程,并且一次又一次地发生严重的风险。尝试控制它(理想情况下,线程的id将链接到用户,所以只要旧线程处于活动状态,用户将无法启动另一个线程)。

2

而不是每次创建一个新的线程有一个工作线程持续轮询共享队列可能更有效率。例如,使用ArrayBlockingQueue,您的Web请求可以简单地将对象添加到队列并返回给用户,并且您的工作线程(或重复计划作业)可以处理重量级处理。

+0

这不会真正解决很多无反应的UI问题...... –

+0

它是所述问题的解决方案。用户界面响应,立即通知用户他们的请求已收到并排队处理。 –