2017-12-18 98 views
1

我有一個名爲'X'的Java應用程序。在Windows環境中,在給定的時間點可能會有多個應用程序實例。 我希望在應用程序'X'中順序執行一段常見的代碼,無論應用程序有多少個實例正在運行。這是可能的,可以實現的嗎?任何建議都會有幫助。從同一個Java應用程序的兩個實例中連續執行

實施例: - 我有一個名爲Executor類,其中一個方法​​將被調用。假設在任何給定的時間點可能有兩個或更多的應用程序實例,我如何使​​方法從不同的實例順序運行? 有沒有像鎖可以從兩個實例訪問,看看鎖是否目前活躍?任何幫助?

+0

你必須運行一箇中央獨立的應用程序「的execute()」方法,並調用它來自使用TCP或任何協議的其他應用程序。這個'execute()'應該是同步的 – janith1024

+0

可能嘗試一些類似於C++中的中央COM服務器,JNI setter標誌指示狀態爲活動狀態。 讓java應用程序檢查來自COM服務器的標誌,如果它的活動讓它等待(某些預定義的時間並再次重試),否則將狀態設置爲活動的COM並繼續執行() 只有關心,如果兩個實例說X1和X2試圖在相同的時間點設置標誌?如何避免衝突? – User

回答

0

據我所知,你做不到這一點很容易。你可以在進程之間實現TCP調用......但我不會建議它。

您應該更好地創建一個負責執行任務的外部進程,並通過向執行程序進程使用的JMS隊列發送消息來執行所有要執行的任務。

...或者,也許你並不真的需要在同時運行多個進程,但你可能需要僅僅是將有多個線程在同一時間進行的事情,有一個線程專用於應用程序Executor。這樣,同步​​方法(或整個Executor)就足夠了,並且可以節省一些時間。

1

我認爲你要找的是一個分佈式鎖(即從多個進程可見和可控的鎖)。考慮到這一點,已經開發了相當多的第三方庫,其中一些在本頁面進行了討論。

Distributed Lock Service

也有這個帖子的一些其他建議其使用文件的底層系統上的synchornization機制。

Cross process synchronization in Java

0

你不能用遺囑執行人或類似的東西做到這一點,因爲Java虛擬機將是獨立的。

如果你真的需要多個獨立實例之間同步的方法之一將是獻給內部端口和執行應用程序中的簡單的內部服務器。看看ServerSocketRMI是全面解決方案,如果你需要廣泛的溝通。第一個實例綁定到專用應用程序端口併成爲主節點。所有稍後的實例都會找到應用程序端口,然後可以使用它來向主節點發送HTTP(或只是TCP/IP)調用,以報告他們需要執行的活動。

由於您只需要按順序執行一些操作,任何從節點都可能會要求主服務器執行此操作,而不是執行自身操作。

這種方法的潛在問題是,如果用戶關閉了主節點,也可能是複雜的實現方法另一個正在運行的節點如何能取代其位置。如果在任何時候只有一個節點處於活動狀態(接收來自用戶的輸入),則在發現主站未響應並且端口未被佔用之後,它可能扮演主節點的角色。

0

分佈式隊列,可用於此類負載平衡。您將一個或多個'請求消息'放入一個隊列中,下一個可用的消費者應用程序將其選中並處理它。每個這樣的請求消息都可以描述你要處理的任務。

這種類型的隊列可以實現爲JMS隊列(例如使用ActiveMQ http://activemq.apache.org/),或者在Windows上還有MSMQ:https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx。 如果性能是一個問題,你可以有C/C++ develepors,也是「共享內存隊列」可能是有趣:shmemq API

相關問題