Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用特殊线程发送邮件_Java_Jsf 2_Jakarta Mail - Fatal编程技术网

Java 使用特殊线程发送邮件

Java 使用特殊线程发送邮件,java,jsf-2,jakarta-mail,Java,Jsf 2,Jakarta Mail,我有一个jsf应用程序运行在Tomcat6.0上,在应用程序的某个地方我向一些用户发送电子邮件。但是发送邮件的速度比我想象的慢,这会导致这些相关页面的丢失 所以我的问题是,;这是一种好的(或可行的)方法,可以将这个过程交给我创建的另一个线程,一个接收邮件发送请求并将其放入队列中的线程,然后将其与主应用程序分开处理。因此,邮件发送过程将脱离主流程,不会影响应用程序的速度。是的,这绝对是一个好主意。你应该非常小心地做。以下是一些值得思考的问题: 当您使用Tomcat时,它不支持EJB开箱即用

我有一个jsf应用程序运行在Tomcat6.0上,在应用程序的某个地方我向一些用户发送电子邮件。但是发送邮件的速度比我想象的慢,这会导致这些相关页面的丢失


所以我的问题是,;这是一种好的(或可行的)方法,可以将这个过程交给我创建的另一个线程,一个接收邮件发送请求并将其放入队列中的线程,然后将其与主应用程序分开处理。因此,邮件发送过程将脱离主流程,不会影响应用程序的速度。

是的,这绝对是一个好主意。你应该非常小心地做。以下是一些值得思考的问题:

当您使用Tomcat时,它不支持EJB开箱即用(因此,
@asynchronous
@Singleton
是毫无疑问的),我将创建一个应用程序范围的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();
    }

}
@ManagedBean(eager=true)
@适用范围
公共类任务管理器{
私人遗嘱执行人;
@施工后
公共void init(){
executor=Executors.newSingleThreadExecutor();
}
公共未来提交(可调用任务){
返回执行者。提交(任务);
}
//或者,如果您想启动并忘记,请取消提交(可运行任务)。
@发情前期
公共空间销毁(){
executor.shutdown();
}
}
这将创建一个线程并将任务放入队列中。您可以在普通bean中使用它,如下所示:

@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).
    }

}
@ManagedBean
@请求范围
公共班级登记册{
@ManagedProperty(“{taskManager}”)
私人任务经理;
公开作废提交(){
// ...
taskManager.submit(新邮件任务(邮件));
//您可能希望在将来保留返回值,但是
//您应该将其存储在视图或会话范围中,以便获得结果
//稍后。请注意,每当您对该线程调用get()时,该线程都会被阻塞。
//您可以完全忽略它(如当前示例所示)。
}
}
要了解有关
java.util.concurrent
API的更多信息,请参阅