[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