java - J2EE - 实现持续运行的组件/守护进程

标签 java jakarta-ee backgroundworker daemon

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

运行方案大致是这样的:

  1. 电子传感器阵列不断通过 USB 将数据写入 ramdisk
  2. “flusher”应用程序尽可能快地处理数据并将其加载到数据库(暂存区)
  3. db使用触发器对数据进行计算,并将结果存储在另一个schema(数据区)
  4. 客户端 webapp 可以按需在图表/报告等中显示处理后的数据

理想情况下,解决方案如下所示:

  1. 数据库服务器 - PostgreSQL
  2. 有一个管理网络界面,可以监控刷新器(即每小时处理的记录或类似的东西),如果作为单独的守护进程实现,则对其进行控制。
  3. 用 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/

相关文章:

java - SSLSocketFactory 和 HttpsURLConnection 在哪里工作不同?

java - Struts 2 中的 validate() 方法如何获得结果 "input"?

c# - 从 BackgroundWorker 转向日志类的 TPL

c# - 后台 worker 可以有一个通用的方法吗?

c# - 如何使用 BackgroundWorker 确保 UI 响应

java - 在 Jackson 的单个文件中反序列化来自多个 YAML 文档的 POJO

java - 移动椭圆和矩形(多部分)的碰撞检测问题

java - 在 Java 中编写自定义 BigInt 时如何使用大基数更有效

java - 什么是 antiJARLocking 属性?

java - weblogic 是开源的吗?