[erlang-questions] gen_server aggregating calls/casts

Sergej Jurecko sergej.jurecko@REDACTED
Mon Jul 8 21:40:23 CEST 2013


Easiest to explain with code:

handle_call(Msg,From,State) ->
{noreply,State#rec{calls = [From | State#rec.calls}};

handle_call(replyall,_,State) ->
[gen_server:reply(From,SomeMessage) || From <- lists:reverse(State#rec.calls)],
{reply,ok,State}

Queue instead of a list is probably better.


Sergej

On Jul 8, 2013, at 9:31 PM, Jonathan Leivent wrote:

> I would like the server process I'm designing to be able to aggregate certain calls and/or casts - but I don't see any way to do this with gen_server.
> 
> Specifically, when this server is within a particular handle_call, it should find all similar calls on its message queue and handle them together, responding to all of the callers at once after performing a single combined action on their behalf.  It can't accumulate calls into its state because there are other unrelated calls/casts it can encounter prior to seeing all of the currently queued matching calls. Conceptually, it needs to do something like:
> 
> drain_all_requests(List) ->
>  receive
>    R={request, _} -> drain_all_requests([R|List])
>  after 0 -> List
>  end.
> 
> handle_call(R={request, Info}, From, State) ->
>  RequestList = drain_all_requests([R]),
>  handle_aggregated_requests(RequestList, State),
>  ...
> 
> However, I can't write the necessary receive to drain the message queue of the matching calls I'd like to aggregate - because I don't know the internal format of message wrappers used by gen_server.  And I don't have a way to respond to any but the one that put the server into the handle_call.  I would be willing to use handle_cast instead (and roll my own response scheme), but I still don't have a way to receive the matching casts on the message queue.
> 
> I guess I could examine the source code for gen_server and determine the call and/or cast message format, then use that.  But, I'd rather play by the modularity rules.  Is there any way I can do that?
> 
> Thanks
> -- Jonathan
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list