我有靈藥一個簡單的事件處理程序使用GenEvent
:啓動相同的事件處理程序的多個實例藥劑
defmodule myHandler do
use GenEvent
#Callback
def handle_event {:message, x}, state do
IO.puts("Message value is #{x}")
{:ok, [x|state]}
end
end
我就可以開始以通常的方式一個處理器和一個經理:
{:ok, mgr} = GenEvent.start_link
myServer.start_link(mgr)
GenEvent.add_handler(mgr,myHandler, [])
但是,我想用一個管理器啓動一個監督樹,其中有N個處理程序,每個處理程序都有一個不同的ID。
我想:
Gen.Event.add_handler({mgr, :id1},myHandler, [])
,沒有運氣!在代替我收到以下錯誤:
** (Mix) Could not start application : exited in: myApp.start(:normal, [])
** (EXIT) no connection to :id1
我是一個新手,藥劑等正與文檔有點掙扎。我會很感激,如果有人能告訴我如何!謝謝。
謝謝你。也許我不太瞭解你的答案,但我試圖向多個處理程序(都是相同的)播放單個事件;一個pubsub機制。所以我不關心過濾出特定的消息。要做到這一點,我需要使用相同的模塊作爲事件處理程序,並將其作爲{模塊,編號}傳遞...在這裏解釋:https://github.com/elixir-lang/elixir/issues/3760但它doesn對我來說沒有任何意義! –
好吧,我想我明白了。上面的代碼,過濾和所有,也可以解決您的問題。我想你使用'id'作爲頻道的名字。在這種情況下,每當進程需要訂閱特定「id」的事件時,只需添加一個具有該ID的新處理程序。訣竅是給處理程序一個與其他處理程序不同的ID:'GenEvent.add_handler manager {MyHandler,handler_id} {id,[]}''。這將防止返回'{:error,:already_present}' –
是的。我想我們的信息只是越過了! –