2

我有一个正在运行的 tomcat 6.20 实例,并且想通过后台线程发送电子邮件以防止电子邮件发送功能阻止请求。

有什么方法可以在后台执行线程,同时仍然允许正常的页面流发生。

该应用程序是用 ICEfaces 编写的。

谢谢。

4

3 回答 3

3
  1. 在控制器/servlet 的初始化方法中创建Executorusing java.util.concurrent.Executors.newCachedThreadPool(或其他工厂方法之一)。
  2. 当请求进来时,将邮件发送逻辑包装在一个java.lang.Runnable
  3. 提交RunnableExecutor

这将在后台执行发送。记得在启动时创建一个 Executor,并在所有请求之间共享;不要每次都创建一个新的 Executor(你可以,但这会有点慢和浪费)。

于 2009-07-28T14:09:02.987 回答
0

将您的电子邮件发送代替Thread.sleep(). 将您的输出替换为sendRedirect().

public void doUrlRequest(HttpServletRequest request, HttpServletResponse response) {
    try {
        response.sendRedirect("/home");
    } catch (IOException e) {
        CustomLogger.info(TAG, "doUrlRequest", "doUrlRequest(): "+e.getMessage());
    }
    (new Thread() {
        public void run() {
            try {
                Thread.sleep(9000);
                System.out.println("Awoken!");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }).start();
于 2018-05-12T22:44:39.667 回答
-1

我找到了出路。这些标签

@PostConstruct()

@PreDestroy()

在您的 servlet 中创建 2 个返回 void 且不接受任何参数的方法。将第一个标签放在第一个方法的正上方,将第二个标签放在第二个标签的上方。

标签的本质

在实现类开始响应 Web 服务客户端之前,容器会调用 @PostConstruct 方法。

@PreDestroy 方法在端点从操作中移除之前由容器调用。

在 PostConstruction() 方法中使用可运行接口创建线程并让它在无限循环中运行,除非某个布尔变量的值为 false。

使用 PreDestroy() 方法将布尔变量设置为 false。

于 2011-08-13T20:22:13.550 回答