2013-04-11 88 views
1

我需要在兩個不同的JAVA程序之間具有遠程方法調用(RMI)功能。兩者都應該按順序在給定文件(文件名作爲參數)上執行一些後端功能。由於要處理的文件數量可能過大,因此我要求遠程調用異步完成。最初我使用Java RMI來完成這個任務,因爲它完全適合,除了調用是同步完成的。這些都是簡單的java程序,我不想將它們部署在任何應用程序服務器上,因爲這會造成太大的開銷。同時需要同時執行多個文件,因此程序是在線程安全模式下開發的。請爲此提出理想的實施方案。任何自定義開發的API如果免費提供將非常有幫助。JAVA異步RMI

回答

1

最簡單的解決方案是讓你的RMI調用啓動一個異步任務。如果你想提高效率,你可以發送批量的文件進行處理。注意:除非您小心,否則磁盤子系統可能是您的瓶頸,並且使用多個線程可能會更慢而不是更快。

0

如果您確定您的應用程序都在Java中(並且將會),那麼您應該使用JMS(Java消息傳遞服務)。異步通信也將成爲第三方代理 - 消息隊列(ActiveMQ或直接嵌入在Glassfish或其他應用服務器中的應用服務器)。

通過使用此功能,您可以發送MQ並將消息發送到其他應用程序。

如果你想要更多的靈活性,也許一些應用程序正在(或將要)以另一種語言編寫,你應該使用AMQP而不是JMS。

3

我需要兩個不同的JAVA程序之間的遠程方法調用(RMI)功能......我要求遠程調用異步完成。

這兩個要求是相互矛盾的。 RMI意味着遠程方法調用,這意味着調用和返回方法調用語義。如果它不是調用和返回的,它不是方法調用,所以它也不是RMI。

您應該研究具有聽衆的技術,例如JMS。

+2

這實際上並不正確。異步方法調用通常使用回調函數或其他形式的continuation來處理它們的返回值。它們通常不會像異步消息發送一樣「忘卻」,它們也不會像演員系統中的消息發送那樣,因此您需要明確地偵聽響應。 – 2016-12-22 12:51:03

+0

@BarryKelly當然,但問題是關於Java RMI,它沒有這樣的功能。 – EJP 2016-12-22 22:55:21

-1

只需旋轉一個線程並從線程中調用方法即可。現在你有異步RMI ;-)

2

擁有真正的異步調用的方法是:

  1. 與NIO實現RMI。
  2. 當代理被調用時,將請求放在NIO選擇器上,並立即返回結果未來給調用者。
  3. 每個請求都必須有一個唯一的請求ID,並且當具有該ID的響應從服務器到達時,應該解決正確的未來。

只有一個實現,我知道這樣的async RMI

這裏是一個很好explanation有關它是如何實際執行序列圖。

0

這是另一個支持異步執行的RMI區域的新玩家。 Redisson框架。有關異步執行的更多文檔是here