[erlang-questions] Message Loop in Gen_Server

John Kemp <>
Wed Apr 17 19:44:31 CEST 2013


Perhaps something like this?:

init(...) ->
    spawn_link(
      module_name, loop, [options]
     ).

loop(...) ->
    receive
        exit -> ok ;
	message ->
          (your code here),
          loop(...)
    end.

You can then send your gen_server an exit message to make it stop whatever it's doing.

JohnK

On Apr 17, 2013, at 1:33 PM, Lee Sylvester wrote:

> Hey guys,
> 
> So, I've hit a "best practice" conundrum in OTP; I have a server utilising gen_server for a RabbitMQ consumer.  In the init of that gen_server, I'm setting up a RabbitMQ connection, but I also need to start a loop.  My guess was that I shouldn't call this before init exits, as I was passing the Connection and Channel objects to state for handling elsewhere.  If I handle the loop in init, surely it will never return?
> 
> To simplify what I'm saying (as I'm confusing myself here), here's my code:
> 
> init([]) ->
>    {ok, Connection} = amqp_connection:start(#amqp_params_network{ host="localhost" }),
>    {ok, Channel} = amqp_connection:open_channel(Connection),
>    amqp_channel:call(Channel, #'exchange.declare'{exchange = <<"user_msgs">>,
>                                                   type = <<"direct">>}),
>    #'queue.declare_ok'{queue = Queue} =
>        amqp_channel:call(Channel, #'queue.declare'{exclusive = true}),
>    State = {Channel, Connection},
>    amqp_channel:call(Channel, #'queue.bind'{exchange = <<"user_msgs">>,
>                                              routing_key = term_to_binary(node(self())),
>                                              queue = Queue}),
>    amqp_channel:subscribe(Channel, #'basic.consume'{queue = Queue,
>        no_ack = true}, self()),
>    receive
>        #'basic.consume_ok'{} -> ok
>    end,
>    loop(Channel),
>    {ok, State}.
> 
> Now, if I don't put the loop in my init, then how can I be sure that the loop is called every time the gen_server restarts?  Can someone please suggest the "right" way to call the loop in my gen_server?
> 
> Thanks loads,
> Lee
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list