tomcat后台线程

发布于 2024-07-29 13:41:00 字数 150 浏览 7 评论 0原文

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

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

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

谢谢。

I have a tomcat 6.20 instance running, and would like to send an email via a background thread to prevent the email sending function from blocking the request.

Is there any way I can execute the thread in the background, while still allowing normal page flow to occur.

The application is written in ICEfaces.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼眸里的快感 2024-08-05 13:41:00
  1. 在控制器/Servlet 的初始化方法中使用 java.util.concurrent.Executors.newCachedThreadPool(或其他工厂方法之一)创建一个 Executor。
  2. 当请求到来时,将邮件发送逻辑包装在 java.lang.Runnable
  3. Runnable 提交给 Executor

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

  1. Create an Executor using java.util.concurrent.Executors.newCachedThreadPool (or one of the other factory methods) in your controller/servlet's initialization method.
  2. When a request comes in, wrap the mail-sending logic in a java.lang.Runnable
  3. Submit the Runnable to the Executor

This will perform the sending in the background. Remember to create a single Executor at startup, and share across all the requests; don't create a new Executor every time (you could, but it would be a bit slow and wasteful).

鹤舞 2024-08-05 13:41:00

将您的电子邮件发送代替 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();

Put your email sending in place of Thread.sleep(). Put your output in place of 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();
奶茶白久 2024-08-05 13:41:00

我已经找到出路了。 这些标记

@PostConstruct()

@PreDestroy()

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

标签的本质

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

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

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

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

I have found a way out. These tags

@PostConstruct()

and

@PreDestroy()

Create 2 methods in your servlet that return void and accept no parameters.
place the 1st tag immediately above the first method and the 2nd tag above second tag.

Essense of the Tags

The @PostConstruct method is called by the container before the implementing class begins responding to web service clients.

The @PreDestroy method is called by the container before the endpoint is removed from operation.

inside the PostConstruction() method create your thread using the runnable interface and have it run in an infinite loop unless the value of a certain boolean variable is false.

use the PreDestroy() method to set the boolean variable to false.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文