Servlets 如何从j2ee中长期运行的流程中获得即时响应?

Servlets 如何从j2ee中长期运行的流程中获得即时响应?,servlets,jakarta-ee,process,Servlets,Jakarta Ee,Process,我似乎在任何地方都找不到可靠的答案。我想我找到了一个关于JMS的,但它让人困惑 如果我正确理解您所说的是启动任务的能力(这将需要一些时间),然后在任务仍在执行时响应用户。根据您的需求,它实际上非常简单,您可以使用普通的旧Java线程来执行该操作 public class DoSillyCounting extends Thread { private volatile int counter; public int getCounter() { return counter; }

我似乎在任何地方都找不到可靠的答案。我想我找到了一个关于JMS的,但它让人困惑

如果我正确理解您所说的是启动任务的能力(这将需要一些时间),然后在任务仍在执行时响应用户。根据您的需求,它实际上非常简单,您可以使用普通的旧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) { }
        }
    }
}
在您的状态页面中,您可以执行以下操作:

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");
}

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

这真的取决于您使用的j2EE堆栈是什么?它只是web层、ejb层还是两者兼而有之?。如果我们谈论的是web,那么您可以使用最新的javaee规范中引入的异步servlet,如果您使用的是普通EJB,那么自然选择是Messege驱动的bean(提到JMS)。当然,您可以设计一个定制的解决方案,例如,您向process发送一些数据,然后j2ee应用程序本身调用您的应用程序(例如http请求),以通知它已经完成了作业的运行。可能性是无穷无尽的,如果一个比另一个好总是取决于具体的场景

你在使用/瞄准哪个servletcontainer?这更多的是一个理论问题,而不是实际问题。理论上的答案是:依赖于servletcontainer。JMS确实是其中一种方法。当谈论j2ee时,产生自己的线程通常是个糟糕的主意
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");
}