【问题标题】:How can i get an immediate response from a long running process in j2ee?如何从 j2ee 中长时间运行的进程中获得即时响应?
【发布时间】:2011-09-29 19:42:17
【问题描述】:

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

【问题讨论】:

  • 你在使用/定位什么 servletcontainer?
  • 这是一个理论问题而不是实际问题
  • 理论上的答案是:取决于 servletcontainer。 JMS确实是其中一种方式。

标签: servlets jakarta-ee process


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果我理解正确,您所说的是启动任务的能力(这将需要一些时间),然后在该任务仍在执行时响应用户。根据您的要求,它确实非常简单,您可以使用普通的旧 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 之类的东西。

    【讨论】:

    • 在谈论 j2ee 时生成自己的线程通常是个非常糟糕的主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2012-12-14
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多