2010-06-19 73 views
1

我想開發一個應用程序,在quit之前必須運行一個新的守護進程來執行主要方法一類。JDK 6:有沒有辦法運行一個新的java進程,執行指定類的主要方法

我要求在主應用程序退出後,守護進程仍然必須執行。

這是一個在Oracle數據庫上運行的Java存儲過程,因此我無法使用Runtime.exec,因爲我無法從操作系統Shell找到java類,因爲它是在數據庫結構而不是文件系統文件中定義的。

特別地,期望的行爲應該是一個遠程數據庫會話期間我應該能夠

呼叫運行守護進程和退出離開該守護進程在執行狀態下的第一Java方法

和然後(具有守護進程向上和會話控制,因爲在最後一次調用終止)必然

呼叫與該守護進程進行通信的方法(即退出最後在通信結束時)

這可能嗎?

感謝

更新

我的確切需要的是創造和加載(達到最好的表演),一個大的文本文件導入數據庫假設主機不從具有文件傳輸服務Java JDK6客戶端應用程序使用JDBC-11G oci驅動程序連接到Oracle 11gR1數據庫。

我已經開發了一個工作解決方案,通過調用一個存儲在文件中的LOB(大型數據庫對象)作爲輸入的過程,但是這種方法使用了太多我想避免的中間結構。

所以我想在第一次調用時在DB上創建一個ServerSocket,然後連接到它並通過直接和快速的通信建立數據傳輸。

我遇到的問題出來了,因爲創建ServerSocket的java程序不能退出,並讓一個正在執行的線程/進程監聽該Socket和客戶端,以確保ServerSocket已經創建,不能運行一個單獨的線程來處理剩餘的工作。

希望得到澄清

回答

1

如果這可能,我會感到驚訝。實際上,您可以用無限數量的守護進程來飽和數據庫服務器機器。

如果這樣的事情是可能的,這個技術可能是Oracle特有的。

也許您可以使用數據庫觸發器或其他此類事件驅動的數據庫功能來實現所需的效果。

我建議解釋你正在試圖解決的確切問題,爲什麼你需要一個守護進程?我的決定是,試圖管理守護進程的生活會變得非常複雜。您可能需要處理諸如防止兩個實例被啓動,意外終止守護進程,在需要維護時取消守護進程等問題。這種東西可能會變得非常混亂。

例如,如果您希望每小時運行一些Java代碼,那麼幾乎可以肯定地有更簡單的方法來實現該效果。操作系統和數據庫傾向於在期望的時間啓動工作。因此,在需要時調用存儲過程可能是您的環境中已經存在的功能。因此,您只需將所需的代碼放入存儲過程即可。不需要你手工編排,啓動和管理。這種方法的一個非常重要的優點是,你最終會使用一個技術,其他人在你的環境中已經理解了。

編寫你正在考慮的代碼的類型是非常有趣,很有趣,但在商業環境中往往是浪費的努力。

+0

nice guitar +1;) – OlimilOops 2010-06-19 09:18:15

+0

我有疑問這是可能的,但我也試圖尋找不同的解決方案。 我沒有評估使用事件編程,但這會稍微複雜一點,因爲這樣做我想我應該: 連接到數據庫以建立第一個會話,然後在終止之前等待QUIT事件。 再次連接到另一個線程中的數據庫,並建立第二個會話,其行爲像守護進程並生成QUIT事件。 一旦第一個會話終止,其線程可以執行與剩餘會話的通信。 你認爲它可以工作嗎? – 2010-06-19 09:28:48

+0

@Oops - 是的,它是Takamine LTD 99,只希望我能更好地演奏它! – djna 2010-06-19 09:43:27

0

爲另一個Main類創建另一個jar,並在您的主應用程序中使用Runtime.getRuntime()。exec()方法調用jar,該方法應該運行運行其他Main類的外部程序(另一個JVM)。

+0

正如我在問題中所述,我無法使用Runtime.exec(),因爲我正在使用無法從操作系統訪問的數據庫存儲過程。 – 2010-06-19 09:38:52

0

您在Java中啓動子流程的方式是Runtime.exec()(或其更方便的包裝器,ProcessBuilder)。如果這不起作用,那麼你就是SOL,除非你可以使用本地代碼來實現等價的功能(在這裏問另一個問題來學習如何在C++層次上啓動子進程),但是至少至少有容易出錯使用標準方法。

如果像Oracle這樣的應用程序服務器允許您訪問啓動子進程或加載本機代碼的功能,我會感到驚訝;兩者都可能導致巨大的惡作劇,因此不可信的代碼被禁止。縱觀你的編輯,你最好的辦法是重新思考你如何解決你真正的問題,例如,通過使用NIO來更有效地管理套接字(並且不要在磁盤上創建額外的文件;你只是必須把額外的詳細代碼清理起來......)

相關問題