我有一个非常简单的Java应用程序,它从Yahoo!下载一组外汇汇率。资助并对它们进行一些计算。我目前在Eclipse中运行此应用程序。
我现在想做两件事:
1。在VPS上部署应用程序,使其可以24 x 7运行
2。开发管理控制台,以便我可以配置应用程序Ex。改变被监控的外汇汇率对,改变采样间隔等,并可视化数据。
我对此做了一些研究,并认为这应该可以使用Spring MVC和JSP,JSTL,JChartFree / Google Visualization API等技术实现。
我无法解决的问题是我将如何使应用程序运行24 x 7.看看Web应用程序的工作方式,似乎Web应用程序将提供请求然后退出(好吧) ,不要退出,但要听取新的要求)。由于上面的第1点,这对我没有好处。我可以使用哪些方法使应用程序24 x 7运行并按需提供其当前状态?
感谢
答案 0 :(得分:3)
创建一个Web应用程序并将其放在像Tomcat或Jetty这样的Web容器中。使用Spring创建持久化进程(应用程序上下文将启动进程或线程池)。使用JMX配置应用程序的行为,启动/停止它等。有关Spring集成JMX的参考资料。
答案 1 :(得分:3)
你是对的,这不太适合作为webapp - 通常他们会将请求作为输入,并进行一些处理以产生HTML输出。并非总是如此,但这肯定是他们通常使用的一般框架,我认为你的特定情况并不适合这个模型。
但是,听起来好像您想提供一个webapp界面来查询应用程序的状态。 听起来有效。
这里似乎有两个独立的组件:
当然,应用程序需要有一些方式来传达其状态,这实际上是你的问题的关键。一种非常简单的方法是,如果应用程序记录它对平面文件/数据库执行的操作,并且您的状态显示webapp读取此信息并从中形成响应。
另一种方法是让应用程序提供一些Web服务功能;即收听自己的套接字并提供对以编程方式调用它的任何内容的响应。然后,您的webapp可以进行这些调用并格式化接收的数据。例如,见CXF tutorial;如果您没有复杂的需求,Web服务可以像编写普通的Java方法一样简单,注释它并在类路径中删除新的JAR。
最后,您可以使JMX工作 - 这与JConsole背后的技术相同,并允许您定义可以查询的自己的托管bean。如果您已经为JConsole定义了一些MBean,那么这将是一个自然的步骤。有关如何编写也访问此数据的客户端的示例,请参阅this document。
请记住,基本问题是如何以编程方式访问正在运行的守护程序的状态,并且有很多方法可以执行此操作; “最好的”取决于很多因素。
答案 2 :(得分:1)
我认为您正在寻找像quartz这样的工作安排程序。您可以将其嵌入到Web应用程序中,让它执行作业而不必将其作为Web请求调用。
答案 3 :(得分:1)
将其作为后台运行线程运行,您在ServletContext
(实际上:应用程序范围)中处理了该线程。 ServletContextListener
非常适合这种情况。 E.g。
public class Config implements ServletContextListener {
private BackgroundTask backgroundTask = new BackgroundTask(); // Extends Thread.
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("config", this);
backgroundTask.start();
}
public BackgroundTask getBackgroundTask() {
return backgroundTask;
}
}
这样您就可以按如下方式在servlet中访问它:
public void doSomething(HttpServletRequest request, HttpServletResponse response) {
Config config = (Config) getServletContext().getAttribute("config");
BackgroundTask backgroundTask = config.getBackgroundTask();
// Now do your thing with it. E.g. backgroundTask.getStatus() ?
}
当然不要忘记将BackgroundTask
设置为守护程序线程,这样你的appserver就不会在关机期间挂起,因为它正在等待线程完成。您可以在调用start()
之前或仅在其构造函数中执行此操作。
public BackgroundTask() {
setDaemon(true);
}
答案 4 :(得分:0)
我认为您的应用程序必须提供实时数据。
如果您愿意使用JSF,可以使用: