我有一個Android設備上運行的Akka系統,它通過Akka Remoting與服務器上的Akka系統進行通信。Akka Remoting是否支持單向連接?
Android設備可能會獲得任何IP地址,在應用程序運行時IP可能會更改,並且IP可能無法從服務器訪問。因此我在Android設備上配置了Akka,使用akka.remote.netty.hostname = "0.0.0.0"
和akka.remote.netty.port = 8000
。
Android Akka系統獲取對服務器上的actor的引用,向它發送消息,服務器上的Actor記錄sender()actorRef並不斷髮送消息給它。當服務器和Android設備位於相同的無線局域網上,以及他們通過互聯網通過GPRS進行通話時,這種方式就可以工作。
現在我正在仔細研究連接損耗和重新連接。我一直關注的場景是:
- Android設備和服務器都在wlan上。
- Android設備向服務器發送消息。
- Android上的Akka remoting生成
RemoteClientStarted
。 - 服務器上的Akka遠程處理產生
RemoteClientStarted
和RemoteServerClientConnected
。 - 然後關閉Android上的wlan,等待幾秒後再打開。中間不會嘗試發送消息到服務器。在Android
- 阿卡遠程產生
RemoteClientShutdown
和RemoteClientError
(ETIMEDOUT) - 服務器上遠程阿卡什麼都不說。
- Android向服務器發送消息。
- 服務器產生
RemoteServerClientConnected
並接收該消息。 - 服務器嘗試發送消息(稱之爲一個下面的問題)到Android,併產生:
RemoteServerError
,RemoteServerClientDisconnected
,RemoteClientShutdown
,RemoteServerClientClosed
。 - Android從不會從服務器獲取消息。
- 服務器嘗試發送另一個消息,但Akkas
RemoteClient
說:- [PassiveRemoteClient @阿卡://[email protected]:8000]已經關閉
- 啓動遠程客戶端連接到[阿卡://[email protected]:8000 | /0.0.0.0]
- RemoteClientError @阿卡://[email protected]:8000:錯誤[...
最後一個錯誤似乎來自於Akka Remote想創建一個新的ActiveRemoteClient
而不是重新使用現有的PassiveRemoteClient
。我想這也是因爲服務器在看到錯誤/斷開連接/關閉/客戶端關閉之前觀察RemoteServerClientConnected事件。
現在的問題:
- 在這種情況下發送報文的時候,服務器如何我可以重複使用的Android設備的最後一個進來的連接(
PassiveRemoteClient
)? - 如何指示服務器永遠不要嘗試連接回客戶端?
版本:
- 的Android:15(4.0.3)
- 阿卡:2.1
- 爪哇:1.6 64bits的
- Scala中:2.10.1
- Netty的:3.5 .8
感謝您的詳細解答,特別是如何使其工作的建議。快速跟進:'RemoteTransport'似乎是在Akka下面實施自己的遠程處理的基礎。這是無證的,所以我不得不問:這是推薦的方式嗎?在即將到來的Akka版本中,機制是否會發生巨大變化? – eirirlar
RemoteTransport將更改爲2。2雖然可以想象,特殊的應用程序創建它們自己,我們並不期望經常發生。有很多與演員消息相關的假設可能不符合您的需求。 –
好的,我猜你會遠離'RemoteTransport'。 對於好奇:我結束了測試akka-zeromq。它是針對zeromq-2.1而構建的,這對我來說是不可接受的。所以我測試了jeromq,它應該是zeromq3的純java端口。不幸的是,這並不能代替akka-zeromq附帶的scala-zeromq-binding,但我分叉了akka-zeromq模塊,並用jeromq替換了對scala-zeromq-binding的依賴。作爲一個魅力工作,但在Android上測試仍然存在。 – eirirlar