簡體   English   中英

從Java Web應用程序控制C應用程序

[英]Control C application from Java web application

我有C應用程序,它們將在不同站點的多台計算機上運行。

現在,我想控制和監視這些C應用程序。 為此,我正在考慮使用Servlet / JSP的Java Web應用程序。

我認為C應用程序將通過TCP連接到Java Web應用程序。 在我的Web應用程序中,我正在考慮實現管理器,該管理器通過TCP與C應用程序進行通信。 當Web應用程序作為單獨的線程啟動時,我將啟動管理器。 管理員將通過上下文和會話與Servlet請求進行通信。 因此,每當用戶在瀏覽器上執行某項操作時,我都希望使用服務器端管理器的功能,並以ServetContext和Session作為接口。

這就是我的想法。 所以,我想知道是否有更好的方法,或者我做錯了什么? 誰能建議我更好的解決方案?

編輯

當前的工作流程:每當我需要啟動/停止C應用程序時,我都必須在SSH遠程計算機puTTY終端上,鍵入長命令,然后啟動/停止它。 每當有問題時,我都必須滾動長日志文件。 還有其他一些事情,例如應用程序正在每秒處理/處理所有事情的實時狀態,因此我無法始終將日志記錄在日志文件中。

因此,我發現這些工作流程很困難。 還有我無法監控的實時狀態。

現在,我想擁有Web應用程序界面。 我可以修改C應用程序並從頭開始實現Web應用程序。

要實施的新工作流程:我想從網頁啟動/停止C應用程序。 我想在網頁上查看日志和實時狀態報告/實時圖形(監視C應用程序在做什么)。 我也想在網頁上監視機器狀態。

我想使用JSP / servlet在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服務也獨立於管理系統運行,則您可能希望將其反轉並讓管理系統連接到服務(除非防火牆阻止了它)。

您肯定會需要一個小的,定義明確的協議。 如果要發送大量字段,甚至可以發送JSON或xml,因為它們已經具有解析器來驗證格式。

注意安全性! 在C端,請確保您不會出現任何緩沖區溢出,並且如果您自己解析信息,請嚴格丟棄(看起來不正確)數據。 在Java上,緩沖區溢出並不是什么大問題,但請確保記錄的數據包與協議不完全匹配,以檢測錯誤和入侵。

您可能會考慮的另一種解決方案-您的系統都已經共享一個數據庫,您可以通過DB發送命令和響應(假設命令/響應不是經常發生)。 我們沒有完全做到這一點,但是我們共享一個變量表,在其中放置名稱/值對,以指示我們系統性能和配置的不同方面(2向),這可能不是最佳選擇,但由於具有靈活性,因此具有驚人的靈活性允許我們在運行時重新配置系統(這些值在每個服務中本地緩存,並每30秒重新讀取/更新一次)。

如果我知道您要做什么的更多細節,我也許可以為您提供更多信息-例如,您的瀏覽器將多久更新一次其字段,發送什么樣的命令信號或數據請求以及什么樣的數據你期望回來嗎? 盡管您當然不必在這里發布這些內容,但是您必須考慮一下-我建議您模擬瀏覽器頁面以開始。


根據評論進行編輯:聽起來不錯,僅提供幾個評論:

2)任何良好的數據庫都應該能夠處理該數量的數據以進行日志記錄,但是您可能希望在數據庫之上使用良好的緩存。

5)您可能希望使用Web框架來呈現圖形並管理更新。 有很多而且大多數人都可以很輕松地做到您所說的話,但是要自己在沒有某種框架的情況下做到這一點可能很難。 我之所以這樣說,是因為您沒有提及。

6)確保可以處理斷開的連接並重新連接。 在測試時,請拔出服務器上的插頭(至少是網絡電纜),並將其留出10分鍾,然后確保將其重新插入時獲得期望的結果(客戶端是否應該自動重新連接?握住原木或將其扔掉?它會擱置多久?)

您可能希望以一種方式來“重新引導”您的C服務。 由於它們是作為服務啟動的,因此通常只需發送一條告訴他們終止/退出的命令即可,因為系統會重新啟動它們。 您可能還需要一個小的監視循環,以便在一定條件下重新啟動它們(例如,它們已經有n分鍾沒有從服務器收到命令了)。 當您在上午10點在加利福尼亞嘗試在凌晨2點使用Austraillia的C服務時,這可能會派上用場。

另外,請考慮攻擊者可以將自己插入客戶端和服務器之間。 如果您使用的是SSL套接字,則應該可以,但如果是原始套接字,則必須非常小心。


更正:

將這么多記錄放入MySQL數據庫可能會遇到問題。 如果未對它建立索引,並且可以減少對它的查詢,則可以。 您可以通過將所有日志的最后5分鍾保留在內存中來實現此目的,從而不必對數據庫進行索引,也無需對插入進行分組或具有非常優化的緩存。

更好的方法可能是放棄數據庫,而只使用預先過濾為單個用戶可能想要查看的內容的平面日志文件,因此,如果用戶要求在最近5分鍾內從您的計算機上收到“ WARN”和“ DEBUG”消息,可以將日志文件從該計算機讀取到內存中,跳過所有警告/調試消息,然后顯示這些消息。 這有它自己的問題,但是應該比索引數據庫更具可伸縮性。 這還將使您能夠壓縮較舊的數據(用戶將不再希望對其進行查詢),從而節省了70-90%的磁盤空間。

以下是我對您當前設計的建議,並且由於您尚未為該項目定義特定范圍:

  • 定義一個協議,以在C應用程序和監視器應用程序之間進行通信。 可能您不需要使用相同格式的所有C應用程序提供相同的信息,或者某些C應用程序比其他應用程序具有更重要的指標。 我建議為此使用普通的JSON並定義要實現的最低綱要,以使C生成數據並使用Java進行消費和驗證。
  • 使用數據庫存儲監視C應用程序的結果。 通用選項將使用RDBMS,可能是像MySQL或PostgreSQL這樣的開源代碼,或者如果您(或您的公司)可以獲取SQL Server或Oracle或其他許可證。 如果您需要保留結果的歷史記錄,並且可以定期清除數據。
  • 可能您希望/需要在某種緩存中獲得最新的監視結果(因為此時性能至關重要),因此您可以使用內存數據庫(例如Hazelcast或Redis),或僅使用簡單的緩存(例如EhCache或Infinispan的。 將數據存儲在外部元素中比將其存儲在簡單的ServletContext更好,因為這些技術知道多線程並支持ACID ,這不是ServletContext的主要用例,但對於監視器來說似乎是必需的。
  • 從Web應用程序中分離將從C應用程序接收數據的監視器。 萬一監視器發生故障或花費太多時間來執行某些操作,Web應用程序將仍然可以工作,而沒有從C應用程序接收和管理數據的開銷。 另一方面,如果Web應用程序開始變慢(由於該應用程序的實現中的問題或應使用探查器發現的問題),則可以重新啟動它,並通過此操作,您的監視器應繼續收集數據從C應用程序中存儲,並將它們存儲在您的數據源中。
  • 對於監視器應用程序中的線程,由於它似乎是基於Java的,因此請使用ExecutorService而不是手動創建和管理線程。

對於這一部分:

用戶監視C應用程序任務,將看到圖形進度,每秒更新一次。 另外,可能在C應用程序中偶爾發生的信息/錯誤事件日志的文本行

您可以使用Rx Java來不更新視圖(JSP,Facelet,純HTML或將要使用的任何視圖),或使用其他反應式編程模型(如Play Framework)從數據庫連續讀取數據(如果使用,則緩存)並更新視圖以直接方式向網絡應用的用戶展示。 如果您不想使用此編程模型,則至少使用彗星WebSockets之類的推送技術。 如果這部分不那么重要,請使用一個簡單的刷新計時器,如下所示: 如何每5秒重新加載一次頁面?

對於這一部分:

C應用程序是每台計算機,它將執行用戶從Web瀏覽器發送的任何任務

您可以重用該協議,以使用JSON將C應用程序與監視器通信,並在每個C應用程序中使用另一個線程來轉換動作並執行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM