2011-11-03 97 views
4

我有一個Java應用程序,它有各種代理(Java Algo's),它們監聽消息並處理它們。每個代理在單個線程上執行這些消息,將這些消息添加到阻塞隊列中逐個處理。對單個消息的這種處理涉及使用遠程機器的I/O。加班時,由於Java中固有的Bug,這些線程被逐個掛起。他們說這個bug是固定的,但不是,我已經在所有最新的java版本上運行它,並嘗試了一個月的所有解決方法。所以,我打算轉移到scala actors。從java線程移動到斯卡拉演員

下面是我的問題:

  1. 是上述要求可能在斯卡拉演員和將它克服了Java的漏洞?
  2. 如何,如果有可能:)

    P.S做一個簡單的概述:我已經通過編程閱讀本書階爲獲取語法和基本特徵。

回答

1
  1. 對於第一個問題答案是肯定的,scala參與者確實克服了由於參與者併發模型而提到的bug。過去兩週我一直在使用它,沒有停機。 Actor是輕量級的,易於擴展並且比java中的線程代理更快地執行。內存消耗也出現了下降。

  2. 現在對於實現部分來說,一旦您瞭解了scala的基礎知識,就很容易編寫演員。如果你使用eclipse + maven插件m2eclipse-scala是開始的地方。我已經使用上述步驟成功構建了一個osgi包。 scala ide是一項正在進行的工作,編寫代碼有點痛苦。

  3. 現在對於斯卡拉演員來說,使用他們的消息收件箱很難。訪問它們是受限制的,並且當消息進入的速率高於參與者可以處理的速率時,它們似乎很容易從內存中跳出。通過使我們能夠設置最大郵箱大小,mailbox-push-timeout..etc或者您可以擁有自己的收件箱實現,Akka演員在這裏肯定有優勢。

感謝您幫助在JVM上

sanre6

1

您引用的錯誤是一個jvm錯誤。因此,如果您在同一個JVM上使用「相同」代碼,您仍然會遇到該錯誤。 Scala仍然運行在JVM上,所以仍然有可能遇到同樣的錯誤。

Scala Actor可能不會以相同的方式運行JVM。但是你不能保證任何事情。試試看看。

+0

啊斯卡拉運行。但不使用java使用的共享狀態和鎖定模型。因此,我相信使用actor併發模型應該克服上述錯誤 – sanre6

+0

@ sanre6是的,那是我的觀點。但直到你嘗試才知道。 –

1

如果您剛剛開始使用演員模型,我強烈建議使用akka.io的演員包。當我開始涉足時,使用標準Scala遠程演員庫時遇到了一些問題。我也曾經聽說過,akka演員的實現將會替代Scala標準庫中的當前演員。

這不能解決您的問題本身,但編寫基於Actor的併發程序比管理自己的關鍵部分簡單得多 - 至少這是我的經驗。