如何通过网页按需显示Java应用程序的当前状态

时间:2009-11-11 14:08:27

标签: java java-ee

我有一个非常简单的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运行并按需提供其当前状态?
感谢

5 个答案:

答案 0 :(得分:3)

创建一个Web应用程序并将其放在像Tomcat或Jetty这样的Web容器中。使用Spring创建持久化进程(应用程序上下文将启动进程或线程池)。使用JMX配置应用程序的行为,启动/停止它等。有关Spring集成JMX的参考资料。

答案 1 :(得分:3)

你是对的,这不太适合作为webapp - 通常他们会将请求作为输入,并进行一些处理以产生HTML输出。并非总是如此,但这肯定是他们通常使用的一般框架,我认为你的特定情况并不适合这个模型。

但是,听起来好像您想提供一个webapp界面来查询应用程序的状态。 听起来有效。

这里似乎有两个独立的组件:

  1. 应用程序本身与Web无关,应该作为“普通”应用程序运行,可能作为后台守护程序/服务运行。
  2. 状态查询功能,它侦听HTTP请求并根据应用程序的状态提供相对简单的响应。
  3. 当然,应用程序需要有一些方式来传达其状态,这实际上是你的问题的关键。一种非常简单的方法是,如果应用程序记录它对平面文件/数据库执行的操作,并且您的状态显示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)

我认为您的应用程序必须提供实时数据。

  • 在服务器端使用作业调度程序或其他解决方案
  • 在客户端(网络浏览器)使用javascript / ajax代码刷新实时数据

如果您愿意使用JSF,可以使用: