我正在设计一个服务器应用程序,它应该持续处理大量数据并使用 Web 界面按需显示结果。
运行方案大致是这样的:
- 电子传感器阵列不断通过 USB 将数据写入 ramdisk
- “flusher”应用程序尽可能快地处理数据并将其加载到数据库(暂存区)
- db使用触发器对数据进行计算,并将结果存储在另一个schema(数据区)
- 客户端 webapp 可以按需在图表/报告等中显示处理后的数据
理想情况下,解决方案如下所示:
- 数据库服务器 - PostgreSQL
- 有一个管理网络界面,可以监控刷新器(即每小时处理的记录或类似的东西),如果作为单独的守护进程实现,则对其进行控制。
- 用 Java 编写的 Flusher 和客户端应用程序,最好使用 J2EE
现在这个问题一直困扰着我,我找不到答案:如何着手编写 flusher 组件,即在 J2EE 中不断在后台运行的进程。
通过搜索网络,基本上出现了三种可能性:
a) 将刷新程序编写为消息驱动的 bean,并使用 JMS 从主应用程序控制它。但是:我不喜欢让 MDB 持续运行的想法,我什至不确定这是否可能
b) 将刷新程序编写为 EJB,并使用定时器/调度服务对其进行控制。然而:事件并不是真正定时的,它只需要在无限循环中运行,直到被告知不要这样做,这似乎是对技术的错误使用。
c) 将刷新程序编写为单独的 java 应用程序,将其作为操作系统服务(Linux 或 Windows)运行,并通过从 EJB 调用的 ProcessBuilder 使用启动脚本进行控制。要监视它的状态,请使用 JMS。然而:在我看来,这只是过于复杂的解决方案,依赖于平台,甚至可能不可靠,因为 EJB 不应该产生/管理它自己的线程,而 ProcessBuilder 基本上是这样做的,这似乎是错误的。
基本上,这些对我来说都不合适,我也想不通,在 Java/J2EE 世界中,我们的正确解决方案是什么。
谢谢 托马斯
最佳答案
我会将“Flusher”应用编写为独立的 Java 进程。也许使用类似 Java Service Wrapper 的东西把它变成你的操作系统的服务。我不太熟悉通过 Java 与 RAM 磁盘接口(interface)的选项,但你要么最终得到一个 InputStream,你可以在进程的整个生命周期中保持打开状态并不断读取,或者你是将在 while 循环中不断轮询。执行以下操作完全可以:
private volotile boolean stopFlag;
...
while(!stopFlag) {
processNextInput();
}
然后你会在另一个线程中有一些其他机制,当你想终止进程时可以将 stopFlag 设置为 true。
至于监控冲洗器,JMX 似乎是一个不错的解决方案。这正是它的目的。您可以创建一个 MBean 来公开您想要的任何类型的状态或统计信息,然后其他进程可以连接到该 MBean 并查询该数据。
然后,“客户端”应用程序将是一个简单的 servlet 应用程序,它会在您的数据库上进行报告,并为您的 flusher 的 MBean 提供一个漂亮的前端。或者,您可以只使用 JMX 控制台监视冲洗器,甚至不让客户端参与该系统部分。
我不认为 EJB 对于这个系统真的有意义。我对 EJB 有点偏见,所以对我的建议持保留态度,但对我来说,我真的认为在这个应用程序中不需要它们。
关于java - J2EE - 实现持续运行的组件/守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353321/