[erlang-questions] Message Loop in Gen_Server

Lee Sylvester <>
Wed Apr 17 20:27:52 CEST 2013


Ahh, thank you.  I have tried to find this using Google, but was unable to find an example.  Any idea what kind of function signature I'd use?

Thanks,
Lee



On 17 Apr 2013, at 19:01, Garrett Smith <> wrote:

> If you're receiving messages in the loop, you're working too hard :)
> 
> Once you start the gen_server, any messages sent to that process (i.e.
> anything that you'd receive in your loop) can be handled via
> handle_info/2.
> 
> If you're polling something, see if you can configure that something
> to send you a message directly instead. I know you can do this with
> the rabbit client.
> 
> On Wed, Apr 17, 2013 at 12:57 PM, Lee Sylvester <> wrote:
>> It's checking for messages from RabbitMQ.
>> 
>> Cheers,
>> Lee
>> 
>> 
>> On 17 Apr 2013, at 18:47, JD Bothma <> wrote:
>> 
>> Can I ask what your never-exiting loop is doing?
>> 
>> what is the purpose of the gen_server if the process will forever loop in
>> loop and not deal with gen_server messages?
>> 
>> 
>> On 17 April 2013 19:33, 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
>> 
>> 
>> 
>> 
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>> 



More information about the erlang-questions mailing list