[erlang-questions] Message Loop in Gen_Server

Garrett Smith <>
Wed Apr 17 20:38:20 CEST 2013


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 <> 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 <> 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