有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Tomcat之外运行TomcatSpring/Struts 2Quartz任务?

我们在Tomcat6上部署了一个应用程序。它构建在Spring/Struts 2上,并计划了几个Quartz任务

我们希望将一些任务从Quartz转移到Linux的cron上,尽可能少地进行编码。如何在Tomcat容器外部和独立Java应用程序中运行这些Spring/Quartz任务


(更新:因为有人想知道我们为什么要这么做)

我们希望将计划的任务转移到它们自己的Java应用程序中,因为我们的Tomcat一直在向我们逼近。没有记录任何错误。我们怀疑这一巨大的石英任务是罪魁祸首,但无论是因为内存泄漏还是由于设置错误导致的Tomcat seg故障,我们仍然不知道

我们想通过将它从Tomcat容器中踢出来隔离它,看看Tomcat是否仍会间歇性死亡。然而,由于该应用程序已经上线(虽然是封闭测试版),我们希望在保持其运行的同时,以最少的编码工作来解决这个问题(因为,你知道,“新代码,新问题”——仅供参考,我们已经在考虑重写/重新设计,但“消防”现在是一个更紧迫的问题)


共 (2) 个答案

  1. # 1 楼答案

    显然,最简单的方法是创建一个独立的Java应用程序,调用您在Quartz中执行的bean方法:

    import org.springframework.context.*;
    import org.springframework.context.support.*;
    
    public class SomeJob {
    
        public static void main(String[] args) {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            MyBean myBean = (MyBean) ctx.getBean("myBean");
            myBean.someMethod();
        }
    
    }
    

    。。然后,在cron中运行这个

  2. # 2 楼答案

    我不熟悉石英,但我熟悉stuts2和cron

    通常在linux中,您使用cron调用单独的进程,因此我认为最好将quartz作业减少到单独的独立程序中。考虑到您的项目的JavaEE性质以及对通过spring获取服务的依赖性,我认为这不是一个特别有吸引力的选择

    我在PHP中见过的第二种方法,但同样适用于struts2,即使用lynx调用特定的url,这可能会触发类似以下内容的作业:

    */15 * * * * lynx -dump http://localhost/MyApp/MyAction
    

    这将每隔15分钟调用您的操作(dump选项阻止lynx进入交互模式,并将输出转储到stdout,以便程序只运行一小会儿),然后可以运行您的作业。然后,您可能希望查看iptables(或类似内容),以限制对那些您不希望从外部访问的服务的访问。您也可以在struts2中实现这一点,方法是将所有这些操作放在一个包中,并生成一个拦截器来检查请求者是否是本地主机

    我认为第二种方法需要的改动最少