J2EE - 实现不断运行的组件/守护程序

时间:2011-03-18 14:21:33

标签: java java-ee backgroundworker daemon

我正在设计一个服务器应用程序,它应该连续地处理大量数据并使用Web界面按需呈现结果。

操作方案大致如下:

  1. 电子传感器阵列通过USB
  2. 不断将数据泄漏到ramdisk中
  3. “flusher”应用程序尽可能快地处理数据并将其加载到db(暂存区域)
  4. 使用触发器,db对数据执行计算并将结果存储在另一个模式(数据区域)
  5. 客户端网络应用程序可以按需显示图表/报告等中的已处理数据
  6. 理想情况下,解决方案看起来像这样:

    1. 数据库服务器 - PostgreSQL
    2. 有一个管理网络界面,可以监控刷新器(即每小时处理的记录或类似的记录),如果实现为单独的守护程序,则控制它。
    3. 用Java编写的Flusher和Client应用程序,最好使用J2EE
    4. 现在问题一直困扰着我,我无法找到答案:如何编写flusher组件,即在J2EE中不断运行的进程。

      通过搜索网络,基本上出现了三种可能性:

      a)将flusher写为消息驱动bean,并使用JMS从主应用程序控制它。但是:我不喜欢让MDB不断运行的想法,我甚至不确定那是否可能

      b)将刷新器写为EJB并使用Timer / Scheduling服务对其进行控制。但是:事件并没有真正定时,它只需要在无限循环中运行,直到被告知不要这样做,只是看似错误的技术使用。

      c)将flusher编写为单独的java应用程序,将其作为OS服务(Linux或Windows)运行,并通过从EJB调用的ProcessBuilder使用启动脚本进行控制。要监视它的状态,请使用JMS。但是:在我看来,这似乎是一个过于复杂的解决方案,依赖于平台,甚至可能不可靠,因为EJB不应该生成/管理它自己的线程,而ProcessBuilder基本上就这样做了,它似乎是错误的。

      基本上,这些看起来都不适合我,我无法弄清楚,我们在Java / J2EE世界中的解决方案是什么。

      谢谢 托马斯

1 个答案:

答案 0 :(得分:2)

我会将“Flusher”应用程序编写为独立的Java进程。也许使用像Java Service Wrapper这样的东西将它变成你的操作系统的服务。我不太熟悉通过Java与RAM磁盘连接的选项,但你要么最终得到一个InputStream,你可以在整个过程的生命周期中保持打开并不断读取,或者你是从一个while循环内部继续进行轮询。做以下事情是完全可以的:

private volotile boolean stopFlag;

...

while(!stopFlag) {
  processNextInput();
}

然后你会在另一个线程中有一些其他机制可以在你想终止进程时将stopFlag设置为true。

至于监控冲洗器JMX似乎是一个很好的解决方案。这正是它的目的。您将创建一个MBean,它将公开您想要的任何类型的状态或统计信息,然后其他进程可以连接到该MBean并查询该数据。

“Client”应用程序将是一个简单的servlet应用程序,它会对您的数据库进行报告,并为您的刷新器提供MBean的漂亮前端。或者,您可以使用JMX控制台监控刷新器,甚至不会让客户端使用该系统。

我不认为EJB对这个系统真的有意义。我对EJB有些偏见,所以请耐心等待我的建议,但对我来说,我并不认为在这个应用程序中需要它们。