2011-11-09 6 views
1

私はjsfアプリケーションをtomcat 6.0上で実行しています。アプリのどこかで私はいくつかのusers.Butにメールを送りますが、私は思ったより遅くメールを送ります。特別なスレッドでメールを送信する

私の質問です。私が作成した別のスレッド、要求を送信したメールを取得してキューに入れ、メインアプリケーションから離れて処理するスレッドにこのプロセスを提供するための良い(または実行可能な)方法です。主な流れのそれはアプリのスピードに影響しません。

答えて

0

はい、間違いなく良いアイデアです。あなたは極度の注意を払ってそれを行うべきです。ここで思考のためのいくつかの食べ物です:

あなたが箱からEJBをサポートする(したがって@Asynchronus@Singleton問題外です)しない、Tomcatを使用しているため、Iメールタスクを処理するためにExecutorServiceを保持するアプリケーションスコープのBeanを作成します。キックオフの例を次に示します。

@ManagedBean(eager=true) 
@ApplicationScoped 
public class TaskManager { 

    private ExecutorService executor; 

    @PostConstruct 
    public void init() { 
     executor = Executors.newSingleThreadExecutor(); 
    } 

    public <T> Future<T> submit(Callable<T> task) { 
     return executor.submit(task); 
    } 

    // Or just void submit(Runnable task) if you want fire-and-forget. 

    @PreDestroy 
    public void destroy() { 
     executor.shutdown(); 
    } 

} 

これは、1つのスレッドを作成し、タスクをキューに入れます。次のようにして、通常の豆でそれを使用することができます。

@ManagedBean 
@RequestScoped 
public class Register { 

    @ManagedProperty("#{taskManager}") 
    private TaskManager taskManager; 

    public void submit() { 
     // ... 

     taskManager.submit(new MailTask(mail)); 
     // You might want to hold the return value in some Future<Result>, but 
     // you should store it in view or session scope in order to get result 
     // later. Note that the thread will block whenever you call get() on it. 
     // You can just ignore it altogether (as the current example is doing). 
    } 

} 

official tutorialを参照してください、java.util.concurrent APIの詳細については。

関連する問題