【问题标题】:tomcat background threadstomcat后台线程
【发布时间】:2009-07-28 14:04:21
【问题描述】:

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

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

应用程序是用 ICEfaces 编写的。

谢谢。

【问题讨论】:

    标签: java tomcat tomcat6 background-process


    【解决方案1】:
    1. 在控制器/servlet 的初始化方法中使用java.util.concurrent.Executors.newCachedThreadPool(或其他工厂方法之一)创建Executor
    2. 收到请求时,将邮件发送逻辑包装在 java.lang.Runnable
    3. 提交RunnableExecutor

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

    【讨论】:

    • 这应该是 j.u.c.Executors.newCachedThreadPool(带 s),但除此之外:同意
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我找到了出路。这些标签

      @PostConstruct()
      

      @PreDestroy()
      

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

      标签的本质

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-09
        • 2010-10-21
        • 2012-11-29
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        相关资源
        最近更新 更多