[erlang-questions] broadcast message to all gen_server
Samuel Elliott
sam@REDACTED
Tue Apr 10 22:04:23 CEST 2012
Why can't you do it in handle_info ? That still has access to modify
the state and do everything a :call does, except maybe reply, however
if you're sending the message from somewhere else, you could just
reply with normal erlang message passing.
Another option is the following: write a function that calls a given
gen_server with what you want it to, then go through your list of
gen_servers using a list comprehension and spawn that function with
the server to run. That said, this is also a fire-and-forget way of
doing it, unless after you call the gen server, you send a message
back to the spawning process to confirm it worked. Something like the
following:
call_servers(Servers, Message, Timeout) ->
[spawn(?MODULE, call_server, [GServer, self() Message]) || GServer
<- Servers ],
wait_loop(Servers, Timeout).
call_server(GServer, Master, Message) ->
gen_server:call(GServer, Message),
Master ! {done, GServer}.
wait_loop(Servers, Timeout) ->
receive
{done, GServer} when lists:member(GServer, Server) ->
Servers1 = lists:delete(GServer, Servers),
case Servers1 of
[] -> ok;
_ -> wait_loop(Servers1, Timeout)
end;
after
Timeout ->
never_finished
end.
Note: Timeout is the maximum time to wait between gen_server:calls,
not the maximum time to wait for them all. that would be more complex,
but might be what you need.
Sam
On Tue, Apr 10, 2012 at 8:37 PM, AD <straightflush@REDACTED> wrote:
> Hey All,
>
> I have a situation where i am trying to handle a case where I am using
> sockjs and need to send a message to each sockjs session_server (which is a
> gen_server). I am using gproc() but I cant simply do a gproc_send() b/c the
> message ends up in handle_info() instead of properly in handle_call(). I
> have managed to work this out, when receiving a message from rabbitmq i do a
> gproc:lookup_pids() and then loop through each pid and do a
> gen_server:call(PID,Message). The issue is this is a linear process, is
> there a way to handle sending gen_server:call() to all the processes
> concurrently ?
>
> One way i thought of doing this is having a lightweight set of "listener"
> processes each mapped to a socjks session process and then use gproc() to
> broadcast to the lightweight process which would in turn send a
> gen_server:call().
>
> Any thoughts?
>
> Thanks
> -AD
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
--
Samuel Elliott
sam@REDACTED
http://lenary.co.uk/
+44 (0)7891 993 664
More information about the erlang-questions
mailing list