Akka(Java API)在這裏。假設我有兩個演員,Watchdog
和BlockingListener
。他們都注射了相互之間的引用:獲取Akka演員等待外部輸入而不掛其他演員
// WARNING!
// All code here is just Groovy-pseudocode
class Watchdog extends UntypedActor {
ActorRef blockingListener
@Override
void onReceive(Object message) {
if(message in Init) {
blockingListener.tell(new StartListening(), self())
} else if(message in SomethingHappened) {
...
}
}
}
class BlockingListener extends UntypedActor {
ActorRef watchdog
@Override
void onReceive(Object message) {
if(message in StartListening) {
while(true) {
// Block and scan for input
String event = waitForNextEvent()
watchdog.tell(new SomethingHappened(event), self())
}
}
}
}
我擔心的while(true)
循環中BlockingListener
將阻止兩個演員之間的正常通信。 會嗎?我擔心的是,當BlockingListener
被告知要StartListening
,它會:
- 輸入
while(true)
循環;然後 - 使
BlockingListener
線程掛起/等待,直到發生事件(在actor系統之外);然後 - 嘗試告訴
Watchdog
有關SomethingHappened(event)
,但是... Watchdog
永遠不會收到SomethingHappened
,因爲它仍然在等待自己的Init
消息來完成正在處理
我對嗎?如果是這樣,這裏有什麼補救措施?我們如何讓BlockingListener
監聽演員系統之外的事件並對它們做出響應?
請勿使用演員來收聽活動。參與者的意圖是被動的,而不是投票/阻止。爲'waitForNextEvent'生成一個單獨的專用線程,並將該事件發送給actor。 –
有趣,@SotiriosDelimanolis,謝謝+1!這裏只是好奇,那麼需要進行HTTP/REST調用或JDBC調用的actor呢? – smeeb
對於HTTP,使用異步客戶端併成功回調,如果事件需要對響應執行某些操作,則將事件發回給actor。對於JDBC來說,這有點複雜,因爲沒有異步工具。您可以分派到專用線程池或演員池。 –