【发布时间】:2015-01-08 22:52:54
【问题描述】:
我有可以在不同站点的多台机器上运行的 C 应用程序。
现在我想控制和监视这些 C 应用程序。为此,我正在考虑使用 Servlet/JSP 的 Java Web 应用程序。
我认为 C 应用程序将通过 TCP 连接到 Java Web 应用程序。在我的 Web 应用程序中,我正在考虑实现通过 TCP 与 C 应用程序通信的管理器。当 Web 应用程序作为单独的线程启动时,我将启动管理器。管理器将通过 Context 和 Session 与 servlet 请求进行通信。所以每当用户在浏览器上做某事时,我想在服务器上使用我的管理器的功能,用 ServetContext 一个 Session 作为接口。
所以这就是我的想法。所以,我想知道是否有更好的方法,或者我做错了什么?谁能建议我更好的解决方案?
编辑
当前工作流程:每当我需要启动/停止 C 应用程序时,我必须通过 SSH 远程机器 puTTY 终端,输入长命令,然后启动/停止它。每当出现问题时,我都必须滚动长长的日志文件。还有其他一些事情,比如应用程序正在做什么/每秒处理所有事情的实时状态,我不能总是在日志文件中登录。
所以我发现这些工作流程很困难。还有我无法监控的直播状态等。
现在我想拥有它的 Web 应用程序界面。我可以修改我的 C 应用程序并从头开始实现 Web 应用程序。
要实施的新工作流程:我想从网页启动/停止 C 应用程序。我想在网页上查看日志和实时状态报告/实时图表(监控 C 应用程序正在做什么)。我也想在网页上监控机器状态。
我想使用 JSP/servlets 用 Java 设计的 Web 界面。
所以,我将修改我的 C 应用程序,以便它可以与 Web 应用程序通信。
问题:
只需要制定新工作流程的指南/最佳实践。
编辑 2
对于控制者或经理之间的混淆,我们深表歉意。两者都是一样的。
我的想法: 系统将由运行在不同站点的 C 应用程序、在 Tomcat 服务器中并行运行的 Java 控制器和 Java Web 应用程序以及 DB 组成。
1) C 应用程序将通过 TCP 连接到控制器。因此,这里的控制器成为服务器和 C 应用程序客户端。
2) C 应用程序将是多线程的,将从控制器接收任务并产生新线程来执行该任务。当控制器告诉停止任务时,C 应用程序将停止该任务的线程。此外,C 应用程序将每秒向控制器发送工作进度(日志)。
3) 控制器从 Web 应用程序接收任务命令(因为两者都在 Tomcat 服务器中并行运行,都在 JVM 上的同一实例中),并且 Web 应用程序将通过 HTTP 接收来自用户的命令。
4) C 应用程序每秒接收到的工作进度(日志)到控制器,然后控制器将日志插入 DB 以供以后分析(需要考虑是否在 MySQL RDBMS 中插入日志好,可能需要做很多插入次数,可能是每秒 100 或 1000 次,永远)。 Web 应用程序还可以从控制器请求最近 5 分钟的日志并通过 HTTP 发送给用户。如果用户正在监控日志,那么 Web 应用程序必须每秒从控制器检索日志并通过 HTTP 发送给用户。
5) 用户监控 C 应用程序任务,将在图表中看到进度,每秒更新一次。此外,在 C 应用程序中可能偶尔发生的信息/错误事件日志的文本行。
6) C 应用程序将是每台机器,它将执行用户从 Web 浏览器发送的任何任务。 C 应用程序将在机器中作为服务运行,它将在机器启动时启动,将连接到服务器,并将永远保持连接到服务器。如果没有要执行的任务,可以空闲运行。
【问题讨论】:
-
如果我的问题不清楚,请告诉我。
-
因此,基本上,您的 Java Web 应用程序中会有一个不同的线程从 C 应用程序收集数据,然后您的 Web 应用程序将从线程中查询这些数据。对吗?
-
@LuiggiMendoza 是的,我正在考虑实现使用 ServletContext/HttpSession 与 Web 应用程序通信并通过 TCP 连接与 C 应用程序通信的管理器(控制器)。当 Web 应用程序启动时,我将在单独的线程中启动管理器。可能在 contextInitialized 事件中启动它。
-
提示:不要使用 ServletContext 或 Session 来存储这些数据。相反,使用第三个组件,如数据库(关系或内存中,可能内存中更适合更快地访问数据),因为它们都不是真正的缓存,并且它们不支持多线程添加/删除元素。此外,我会将管理器应用(从 C 应用接收数据)和网络应用分开。
-
@LuiggiMendoza 当然,我将有数据库来存储数据。但是为了分享一些最近的日志数据,我想直接分享到网络应用程序(同步)。
标签: java c tcp middleware