[erlang-questions] Message Loop in Gen_Server

Lee Sylvester lee.sylvester@REDACTED
Wed Apr 17 21:07:56 CEST 2013


Thanks, Garrett.  That give me some direction.

Regards,
Lee


On 17 Apr 2013, at 19:38, Garrett Smith <g@REDACTED> wrote:

> Something like this:
> 
> {ok, Connection} = amqp_connection:start(Params),
> {ok, Channel} = amqp_connection:open_channel(Connection),
> QDecl = #'queue.declare'{queue=Name, auto_delete=true, exclusive=true},
> #'queue.declare_ok'{queue=Queue} = amqp_channel:call(Channel, QDecl),
> QBind = #'queue.bind'{queue=Queue, exchange=Exchange, routing_key=Binding},
> amqp_channel:call(Channel, QBind)
> 
> At this point, messages delivered to the queue should be sent to your
> process (handle via handle_info/2) as this:
> 
> {#'basic.deliver'{exchange=Exchange, routing_key=Key}, Msg}
> 
> Rabbit plugins are implemented as Erlang apps, so I would imagine
> there are some good examples out there to look at as well.
> 
> Garrett
> 
> On Wed, Apr 17, 2013 at 1:27 PM, Lee Sylvester <lee.sylvester@REDACTED> wrote:
>> 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 <g@REDACTED> 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 <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