在 Tomcat 中运行后台 Java 程序 [重复]

2023-12-23

有人可以在这里提供建议吗?我遇到过这样的情况:用户将通过 Java JSP 和 servlet 以交互方式向我的应用程序提交数据挖掘请求,该应用程序将动态计算出数据等的关联规则。

由于这样的工作可能需要一段时间,我正在考虑服务器上的某种进程在后台运行这样的请求,这样它就不会“锁定”会话,并且可能会使用大量的服务器内存,从而造成损害系统的。

由于该系统由一系列 Java JSP 和 servlet 组成,这些 Java JSP 和 servlet 在 MySQL 数据库上的 Tomcat 容器中运行,任何人都可以建议前进的方向吗?

Thanks

摩根先生


Use an 执行服务 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html.

不过,您应该做一些事情,将线程标记为守护线程,这样它至少不会在错误情况下占用 tomcat,并且当您的 servlet 上下文被破坏时(例如,当您重新部署或停止您的应用程序时),您应该停止执行程序. 为此,请使用 ServletContextListener:

public class ExecutorContextListener implements ServletContextListener {
    private  ExecutorService executor;

    public void contextInitialized(ServletContextEvent arg0) {
        ServletContext context = arg0.getServletContext();
        int nr_executors = 1;
        ThreadFactory daemonFactory = new DaemonThreadFactory();
        try {
            nr_executors = Integer.parseInt(context.getInitParameter("nr-executors"));
        } catch (NumberFormatException ignore ) {}

        if(nr_executors <= 1) {
        executor = Executors.newSingleThreadExecutor(daemonFactory);
        } else {
        executor = Executors.newFixedThreadPool(nr_executors,daemonFactory);
       }
          context.setAttribute("MY_EXECUTOR", executor);
      }

    public void contextDestroyed(ServletContextEvent arg0) {
        ServletContext context = arg0.getServletContext();
        executor.shutdownNow(); // or process/wait until all pending jobs are done
    }

}
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * Hands out threads from the wrapped threadfactory with setDeamon(true), so the
 * threads won't keep the JVM alive when it should otherwise exit.
 */
public class DaemonThreadFactory implements ThreadFactory {

    private final ThreadFactory factory;

    /**
     * Construct a ThreadFactory with setDeamon(true) using
     * Executors.defaultThreadFactory()
     */
    public DaemonThreadFactory() {
        this(Executors.defaultThreadFactory());
    }

    /**
     * Construct a ThreadFactory with setDeamon(true) wrapping the given factory
     * 
     * @param thread
     *            factory to wrap
     */
    public DaemonThreadFactory(ThreadFactory factory) {
        if (factory == null)
            throw new NullPointerException("factory cannot be null");
        this.factory = factory;
    }

    public Thread newThread(Runnable r) {
        final Thread t = factory.newThread(r);
        t.setDaemon(true);
        return t;
    }
}

您必须将上下文侦听器添加到 web.xml,您还可以在其中指定要运行后台作业的线程数:

  <listener>
    <listener-class>com.example.ExecutorContextListener</listener-class>
  </listener>

您可以从 servlet 访问执行器并向其提交作业:

ExecutorService executor = (ExecutorService )getServletContext().getAttribute("MY_EXECUTOR");
...
executor.submit(myJob);

如果你使用Spring,这一切可能都可以实现simpler http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Tomcat 中运行后台 Java 程序 [重复] 的相关文章

随机推荐

  • 返回从类到此的引用

    我有以下 foo 类成员 foo foo bar return this 但我收到编译器错误 我做错了什么蠢事 编译器错误 gcc 错误 从类型 foo const 的临时类型对 foo 类型的非常量引用进行无效初始化 this是一个指针
  • 在Python中快速生成3D噪声

    我需要一种在 python 中快速生成 3D 单纯形噪声的方法 有哪些方法可以解决这个问题 pip install noise http pypi python org pypi noise http pypi python org pyp
  • 在 Bash 脚本中并行使用 Ping

    因此 我尝试在 bash 脚本中并行 ping 一系列地址 计算存活的地址 然后将其打印出来 该脚本可以 ping 地址并打印出活动地址 但它总是输出 在线主机数为0 离线主机数为254 它没有增加我的代码中的 ALIVE 变量 也许是因为
  • Spark 文件流问题

    我正在尝试使用 Spark Streaming 的简单文件流示例 spark streaming 2 10 版本 1 5 1 public class DStreamExample public static void main final
  • iPhone 上“X 想使用您当前的位置”背后的规则是什么?

    在 iPhone 上使用位置感知会触发 X 想使用您当前的位置 不允许 确定 在里面CL位置管理器 http developer apple com iphone library documentation CoreLocation Ref
  • 如何使用Python正则表达式匹配没有数字字符的字母字符?

    使用Python模块re 如何获得 w 匹配字母数字字符 的等价物而不匹配数字字符 可以通过 0 9 匹配的字符 请注意 基本需求是匹配任何没有数字字符 由 0 9 匹配 的字符 包括所有 unicode 变体 最后一点 我确实需要一个正则
  • Google 在实时服务器上登录 API 重定向时出现 403 禁止错误

    我在我的网站中实现了 Google SignIn API 它在 LocalHost 上工作正常 但是当我将其上传到实时服务器上时 在用户输入凭据并且 google 将用户重定向到我的网站后 它会给出错误 403 禁止 我尝试在网上关注不同的
  • 无法使用后端的 python Flask 和 ssl 验证 Facebook webhook 订阅中的 URL

    我正在尝试开始使用 FB 的新通讯平台 所以我有一个名为 即 www mysite com 的服务器 我获得了该域的有效 SSL 证书 并且 apache 设置正确 一切都很好 我的服务器上有一个运行flask的python代码 我将它指向
  • 检测 Mac 上 AIR 应用程序中的不同退出选项

    我有一个在 Mac 上运行的 AIR 应用程序 并且我希望在有人 关闭 应用程序 例如点击红色 x 按钮或 cmd w 时隐藏窗口 但是 如果有人点击 cmd q 或从扩展坞上下文菜单或顶级菜单中选择 退出 我希望应用程序真正关闭 我可以阻
  • 函数式编程与 Web 开发相关吗? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我最近看到了很多关于函数式编程的内容 Clojure 看起来特别有趣 虽然我 理解 了它的基本描述 但如果可以的话 我无法弄清楚作为一名 W
  • EntityFramework:无法确定“system.data.sqlclient.sqlclientfactory”类型的提供程序工厂的提供程序名称

    我有一个使用实体框架和 SQLServer 的网站 当我尝试在 Azure 上运行我的应用程序时 出现以下错误 Unable to determine the provider name for provider factory of ty
  • 当使用 nerdctl 代替 docker 时,应该使用什么来代替“host.docker.internal”?

    使用 docker 桌面时 我们将使用 URL host docker internal 从容器连接到主机 但是 当我使用时 容器无法连接到主机 即我的机器 nerdctl https github com containerd nerdc
  • 如何禁用图例单击以阻止饼图切片在 Highcharts 中消失?

    如何禁用图例单击以阻止饼图切片在 Highcharts 中消失 请参阅此处的示例 http www highcharts com demo pie legend http www highcharts com demo pie legend
  • 如何更改 UIImage 的饱和度?

    我有一个 UIImage 想将其饱和度调整大约 10 是否有可用于此目的的标准方法或函数 为此有一个 CoreImage 过滤器 CIColorControls只需设置inputSaturation 1 0 增加饱和度 例如 这是我在类别中
  • GMSMapStyle 未解析的标识符

    我想在 ios 中更改我的谷歌地图样式 为此 我正在尝试实现此代码 GMS地图样式 https developers google com maps documentation ios sdk styling 我正在进口import Goo
  • 如何检查对象是否正在@synchronized

    有时我会编写以下代码来同步例程 synchronized objToBeSync 当两个线程尝试同时访问同步块时 其中一个线程会阻塞其他线程 直到其中一个线程退出同步块 但是 有时我不希望一个对象阻塞另一个对象 但其他对象检查对象是否正在同
  • CSS 中字体大小的最佳单位

    各自的优点和缺点是什么 em px and pt 我当前的选择是百分比 唯一的原因是因为我可以全局更改所有元素的字体大小 只需修改根元素 主体 上的字体大小即可 我会推荐 EM 只是因为我使用 Baseline CSS 来设置基本的表单 布
  • google+ 分享和 onendinteraction - 无需确认

    我正在设置一个 google 分享按钮 并想知道何时有人分享了该链接 以便我可以执行操作 您可以使用以下命令在共享按钮上注册回调onendinteraction属性 并且文档指出 只要共享框关闭以及共享完成 就会调用此函数 我的函数是在窗口
  • Tensorflow 无法工作:无法加载动态库“nvcuda.dll”; dlerror:找不到 nvcuda.dll

    几周前 我安装了适用于 CPU Windows 的 TensorFlow 并且运行良好 然而 今天我尝试为 GPU 安装它 但我的 GPU 不受支持 所以我删除了 GPU 版本并重新安装了 CPU 版本 现在 当我尝试运行一个简单的卷积神经
  • 在 Tomcat 中运行后台 Java 程序 [重复]

    这个问题在这里已经有答案了 有人可以在这里提供建议吗 我遇到过这样的情况 用户将通过 Java JSP 和 servlet 以交互方式向我的应用程序提交数据挖掘请求 该应用程序将动态计算出数据等的关联规则 由于这样的工作可能需要一段时间 我