Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Tomcat之外运行Tomcat Spring/Struts 2-Quartz任务?_Java_Jakarta Ee_Tomcat_Struts2_Quartz Scheduler - Fatal编程技术网

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

Java 如何在Tomcat之外运行Tomcat Spring/Struts 2-Quartz任务?,java,jakarta-ee,tomcat,struts2,quartz-scheduler,Java,Jakarta Ee,Tomcat,Struts2,Quartz Scheduler,我们在Tomcat6上部署了一个应用程序。它构建在Spring/Struts 2上,并计划了几个Quartz任务 我们希望将一些任务从Quartz转移到Linux的cron上,尽可能少地进行编码。如何在Tomcat容器外部和独立Java应用程序中运行这些Spring/Quartz任务 (更新:因为有人想知道我们为什么要这么做) 我们希望将计划的任务转移到它们自己的Java应用程序中,因为我们的Tomcat一直在向我们逼近。没有记录任何错误。我们怀疑这一巨大的石英任务是罪魁祸首,但无论是因为内存

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

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


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

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


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

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

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

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

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


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

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

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

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

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


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

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


Meh.

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


Meh.

问题:为什么?这真的值得吗?我建议您在继续实施之前先评估一下…@Nupul,我必须道歉,我知道为什么在这种情况下会有所帮助。为什么不在不同的容器(玻璃鱼)上测试?你有没有努力使用分析器?您在应用程序中设置了日志记录吗?如果它没有得到很好的实现,那么与重新设计一些可能只需要轻微修复的东西相比,这将需要很短的时间。您应该能够使用不同的容器更快地进行测试,并查看作业是否在那里终止,如果是这样,您可以修剪项目直到将其隔离,这需要更少的工作(但我还是从探查器和日志开始)。在不同的服务器上使用相同的容器并进行修剪也是另一种策略。如果启用调试或跟踪级别的日志记录,则会记录一些内容,最后编写的内容会很有趣。我希望在不同的服务器上进行并行部署,但当我们要求我们的基础设施人员提供相同规格的服务器时,他们说他们不再设置“旧”配置——我们的prod服务器在CentOS 5.x上,但他们说他们现在只能设置CentOS 6.x。别问我为什么,我只会说“企业环境”。问题:为什么?这真的值得吗?我建议您在继续实施之前先评估一下…@Nupul,我必须道歉,我知道为什么在这种情况下会有所帮助。为什么不在不同的容器(玻璃鱼)上测试?你有没有努力使用分析器?您在应用程序中设置了日志记录吗?如果它没有得到很好的实现,那么与重新设计一些可能只需要轻微修复的东西相比,这将需要很短的时间。您应该能够通过使用不同的容器来更快地进行测试,并查看作业是否在那里终止,如果是这样,您可以修剪项目直到将其隔离,这需要更少的工作(但我还是从探查器和日志记录开始)