У меня есть простой обработчик событий в эликсира с помощью 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 обработчиков, каждый с другим идентификатором, используя тот же менеджер.
Я пробовал:
Gen.Event.add_handler({mgr, :id1},myHandler, [])
, не повезло! Вместо я получаю следующее сообщение об ошибке:
** (Mix) Could not start application : exited in: myApp.start(:normal, [])
** (EXIT) no connection to :id1
Я новичок в эликсир и так борюсь с документацией немного. Буду признателен, если кто-нибудь покажет мне, как это сделать! Благодарю.
спасибо за это. Может быть, я не слишком хорошо понимаю ваш ответ, но я пытаюсь передать одно событие нескольким обработчикам (это все равно); механизм pubsub. Поэтому я не занимаюсь фильтрацией определенных сообщений. Для этого мне нужно использовать тот же модуль, что и обработчик событий, и передать его в виде {Module, id} ... здесь: https://github.com/elixir-lang/elixir/issues/3760 Но это не так Для меня это не имеет никакого значения! –
Хорошо, думаю, я понял. Вышеприведенный код, с фильтрацией и всеми, также может решить вашу проблему. Думаю, вы используете 'id' как имя для канала. В этом случае каждый раз, когда процесс должен подписаться на событие определенного «id», просто добавьте новый обработчик с этим идентификатором. Трюк состоит в том, чтобы дать обработчику также идентификатор, отличный от других обработчиков: 'GenEvent.add_handler manager {MyHandler, handler_id} {id, []}'. Это предотвратит возврат '{: error,: already_present}' –
Да. Я думаю, что наши сообщения просто пересекли! –