[erlang-questions] Message Loop in Gen_Server
Garrett Smith
g@REDACTED
Wed Apr 17 20:01:00 CEST 2013
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 <lee.sylvester@REDACTED> wrote:
> It's checking for messages from RabbitMQ.
>
> Cheers,
> Lee
>
>
> On 17 Apr 2013, at 18:47, JD Bothma <jbothma@REDACTED> 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 <lee.sylvester@REDACTED> 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
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
More information about the erlang-questions
mailing list