2011-09-29 100 views

回答

2

这真的取决于您使用的堆栈j2EE?它只是网络,ejb层或两者?如果我们在谈论Web,那么您可以使用在最新的Java EE规范中引入的异步servlet,如果您使用纯EJB,那么自然选择是Messege驱动bean(提到的JMS)。你当然可以设计一个自定义的解决方案,例如你发送一些数据进行处理,然后j2ee应用程序自己调用你的应用程序(例如通过http请求)来通知它完成了运行的工作。可能性是无止境的,如果一个人比其他人好,总是取决于具体的情况。

+0

谢谢先生,这很合适 – volk

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的东西。

+2

在讨论j2ee时产生自己的线程通常非常糟糕的想法 – Kris

+1

点好了。 – tribeca

+0

感谢您的帮助! – volk

相关问题