使用ExecutorService GlassfishのかJBossのような本当のAppServerにスイッチをeigherまたは(リンクの下に)自分自身でTomcatにJMS機能を追加することがあります。
スレッドをデーモンスレッドとしてマークすると、エラーシナリオでは少なくともtomcatと結びついていないので、サーブレットコンテキストが破棄されたときにexecutorを停止する必要があります(たとえば、再デプロイ時。またはこれを行うには、あなたのアプリケーションを停止、のServletContextListener使用:
public class ExecutorContextListener implements ServletContextListener {
private ExecutorService executor;
public void contextInitialized(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
int nr_executors = 1;
ThreadFactory daemonFactory = new DaemonThreadFactory();
try {
nr_executors = Integer.parseInt(context.getInitParameter("nr-executors"));
} catch (NumberFormatException ignore) {}
if(nr_executors <= 1) {
executor = Executors.newSingleThreadExecutor(daemonFactory);
} else {
executor = Executors.newFixedThreadPool(nr_executors,daemonFactory);
}
context.setAttribute("MY_EXECUTOR", executor);
}
public void contextDestroyed(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();
executor.shutdownNow(); // or process/wait until all pending jobs are done
}
}
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
/**
* Hands out threads from the wrapped threadfactory with setDeamon(true), so the
* threads won't keep the JVM alive when it should otherwise exit.
*/
public class DaemonThreadFactory implements ThreadFactory {
private final ThreadFactory factory;
/**
* Construct a ThreadFactory with setDeamon(true) using
* Executors.defaultThreadFactory()
*/
public DaemonThreadFactory() {
this(Executors.defaultThreadFactory());
}
/**
* Construct a ThreadFactory with setDeamon(true) wrapping the given factory
*
* @param thread
* factory to wrap
*/
public DaemonThreadFactory(ThreadFactory factory) {
if (factory == null)
throw new NullPointerException("factory cannot be null");
this.factory = factory;
}
public Thread newThread(Runnable r) {
final Thread t = factory.newThread(r);
t.setDaemon(true);
return t;
}
}
あなたのweb.xmlにコンテキスト・リスナーを追加する必要があります、あなたはまた、あなたが実行したいと思うスレッドの数を指定することができますバックグラウンドジョブ:
<listener>
<listener-class>com.example.ExecutorContextListener</listener-class>
</listener>
サーブレットからエグゼキュータにアクセスし、それにジョブを送信:あなたが春を使用している場合
ExecutorService executor = (ExecutorService)getServletContext().getAttribute("MY_EXECUTOR");
...
executor.submit(myJob);
、このすべては、おそらくsimpler
出典
2011-02-05 16:24:58
nos
あなたが戻って応答を与えることを期待している行うことができますか?また、Tomcatでは複数の同時リクエストを処理するために必要なときに展開できるスレッドプールを使用します。 –
"データマイニング要求"の結果をユーザーに表示する(または完了したジョブを通知する)必要がありますか?そして、どうすればそれをする必要がありますか? –
私は、仕事が終わったときに、結果が利用可能であると言うためにユーザーにメールを送ることができると考えていました。 –