Обработчик отдыха Cowboy и связь gen_servers

У меня есть обработчик ковбойского отдыха, который должен порождать пару gen_servers. Как лучше всего отправлять/обрабатывать сообщения в моем ковбойском обработчике? Есть ли только одна возможность отправить сообщение от gen_server обработчику, используя "!" оператор?


person Max Grigoriev    schedule 05.06.2013    source источник


Ответы (2)


Cowboy порождает процесс Erlang с каждым запросом. Вы можете использовать стандартную передачу сообщений, но я не думаю, что это приведет к элегантному решению.

Почему бы не использовать gen_server:call и gen_server:cast для отправки сообщения от обработчика ковбоя? Еще лучше, если вы завернете call и cast в правильный API.

person Tilman    schedule 05.06.2013
comment
Да, я использую cast/call, когда сообщение идет от ковбоя к пользовательскому gen_server, но тогда gen_server должен отправить ответ, и кажется, что это возможно только с ! оператор. - person Max Grigoriev; 05.06.2013
comment
cast всегда будет возвращать ok. Он предназначен для асинхронной обработки. Для call вы можете ответить {reply, my_response_message, State}. в конце handle_call. Вызывающий получит my_response_message. - person Tilman; 05.06.2013

Похоже, вы хотите использовать концепцию Cowboy обработчик цикла. Сделайте свой обработчик обработчиком цикла, а затем отправляйте ему сообщения с ваших gen_servers, используя !

person johlo    schedule 09.06.2013
comment
можно ли смешивать обработчик цикла и обработчик отдыха? - person Max Grigoriev; 10.06.2013
comment
Нет, это невозможно, обработчик REST в cowboy разработан на основе концепции работы с ресурсом, так что это не лучшее место для выполнения каких-то сложных действий. В любом случае, вы можете создать свой собственный обработчик цикла для своей проблемы. Но мне кажется, что существующего обработчика REST, который в основном порождает новые gen_server и выполняет call внутри них, должно быть достаточно. - person Keynslug; 10.06.2013
comment
да, жаль, что мир erlang не полностью реализован как Java, и многие действия должны быть заново реализованы каждым разработчиком снова и снова :( - person Max Grigoriev; 10.06.2013