首页 文章

如何在Tomcat之外运行Tomcat-Spring / Struts 2-Quartz任务?

提问于
浏览
1

我们在Tomcat 6上部署了一个应用程序 . 它基于Spring / Struts 2构建,并安排了几个Quartz任务 .

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


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

我们希望将计划任务移动到他们自己的Java应用程序,因为我们的Tomcat一直在为我们而死 . 没有记录错误 . 我们怀疑我们拥有的这个巨大的Quartz任务是罪魁祸首,但无论是因为内存泄漏还是由于设置错误导致的Tomcat分段错误,我们仍然不知道 .

我们希望通过将其从Tomcat容器中取出来隔离它,并查看Tomcat是否仍会间歇性地死亡 . 但是,由于应用程序已经存在(尽管处于封闭测试阶段),我们希望以最少的编码工作对其进行故障排除,同时仍保持运行(因为,“新代码,新问题” - 仅供参考,我们已经在考虑改写/重新设计,但“消防”现在是一个更紧迫的问题 .

2 回答

  • 1

    我不熟悉Quartz,但我熟悉stuts2和cron .

    通常在linux中你用cron调用单独的进程,所以我认为最好将石英作业减少到单独的独立程序中 . 考虑到项目的Java EE性质以及通过spring对依赖于查询服务的依赖性,我认为这不是一个特别有吸引力的选择 .

    我在PHP中看到但与struts2同样有效的第二条路径是使用lynx来调用特定的url,这可能会触发这样的工作:

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

    哪个会每15分钟调用一次你的动作(转储选项可以防止lynx进入交互模式,只是将输出转储到stdout,这样程序就会运行一会儿),然后可以运行你的工作 . 然后,您需要查看iptables(或类似内容)以限制对您不希望从外部访问的服务的访问 . 您也可以在struts2中执行此操作,方法是将所有这些操作放在一个包中,并使拦截器检查请求者是否为本地主机 .

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

  • 0

    显然,最简单的方法是创建一个独立的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中运行它 .

    咩 .

相关问题