如何从j2ee中的长时间运行过程中立即得到响应?

时间:2011-09-29 19:42:17

标签: servlets java-ee process

我似乎无法在任何地方找到可靠的答案。我认为我找到了一个关于JMS但它令人困惑。

2 个答案:

答案 0 :(得分:2)

这真的取决于你使用的是哪一堆j2EE?它只是web,ejb层还是两者兼而有之?如果我们在讨论Web,那么你可以使用最新的Java EE规范中引入的异步servlet,如果你使用的是普通的EJB,那么自然的选择就是Messege驱动的bean(提到JMS)。您当然可以设计一个自定义解决方案,例如您发送一些数据进行处理,然后j2ee应用程序本身调用您的应用程序(例如,使用http请求)来通知它已完成运行该作业。可能性是无穷无尽的,如果一个比其他更好总是取决于具体的情况。

答案 1 :(得分:0)

如果我正确理解你所说的是启动任务的能力(需要一些时间),那么当该任务仍在执行时,会响应用户。根据您的要求,它非常简单,您可以使用普通的旧Java线程来执行操作。

public class DoSillyCounting extends Thread {
    private volatile int counter;
    public int getCounter() { return counter; }
    public run() {
        while (counter < 10) {
            counter ++;
            try { Thread.sleep(1000); }
            catch (InterruptedException ie) { }
        }
    }
}

在您的设置页面中,您可以执行以下操作:(会话是HttpSession)

DoSillyCounting doSillyCounting = new DoSillyCounting();
doSillyCounting.start();
session.putValue("tenSecondsCounter", doSillyCounting);
/* Here you can respond to the user while the Thread is executing */

在您的状态页面中,您可能会这样做:

DoSillyCounting doSillyCounting =
    (DoSillyCounting)session.getValue("tenSecondsCounter");
out.print(Integer.toString(doSillyCounting.getCounter());
if (doSillyCounting.isAlive()) {
    out.print("Still Working on it");
} else {
    out.print("Yippee, I finished");
}

当然,这是一个相当无用的示例,当您可能需要满足大量请求时,这个模型不是一个好主意,因此值得查看ThreadPool实现或使用类似JMS的东西。