gpt4 book ai didi

java - 使用特殊线程发送邮件

转载 作者:行者123 更新时间:2023-12-01 05:36:47 26 4
gpt4 key购买 nike

我有一个在tomcat 6.0上运行的jsf应用程序,在应用程序的某个地方我向一些用户发送电子邮件。但是发送邮件比我想象的要慢,它导致这些相关页面之间缺少。

所以我的问题是;这是一种很好的(或可行的)方法来将此过程交给我创建的另一个线程,该线程获取邮件发送请求并将这些请求放入队列中,并在主应用程序之外处理这些请求。因此,邮件发送过程将结束主要流程,不会影响应用程序的速度。

最佳答案

是的,这绝对是个好主意。您应该非常小心地进行此操作。这里有一些值得思考的地方:

由于您使用的是 Tomcat,它不支持开箱即用的 EJB(因此 @Asynchronus @Singleton 是不可能的),我将创建一个应用程序作用域 bean 包含 ExecutorService处理邮件任务。这是一个启动示例:

@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();
}

}

这会创建一个线程并将任务放入队列中。您可以在普通 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).
}

}

要了解有关 java.util.concurrent API 的更多信息,请参阅 official tutorial .

关于java - 使用特殊线程发送邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com