我正在设计一个服务器应用程序,它应该连续地处理大量数据并使用Web界面按需呈现结果。
操作方案大致如下:
理想情况下,解决方案看起来像这样:
现在问题一直困扰着我,我无法找到答案:如何编写flusher组件,即在J2EE中不断运行的进程。
通过搜索网络,基本上出现了三种可能性:
a)将flusher写为消息驱动bean,并使用JMS从主应用程序控制它。但是:我不喜欢让MDB不断运行的想法,我甚至不确定那是否可能
b)将刷新器写为EJB并使用Timer / Scheduling服务对其进行控制。但是:事件并没有真正定时,它只需要在无限循环中运行,直到被告知不要这样做,只是看似错误的技术使用。
c)将flusher编写为单独的java应用程序,将其作为OS服务(Linux或Windows)运行,并通过从EJB调用的ProcessBuilder使用启动脚本进行控制。要监视它的状态,请使用JMS。但是:在我看来,这似乎是一个过于复杂的解决方案,依赖于平台,甚至可能不可靠,因为EJB不应该生成/管理它自己的线程,而ProcessBuilder基本上就这样做了,它似乎是错误的。
基本上,这些看起来都不适合我,我无法弄清楚,我们在Java / J2EE世界中的解决方案是什么。
谢谢 托马斯
答案 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有些偏见,所以请耐心等待我的建议,但对我来说,我并不认为在这个应用程序中需要它们。