[erlang-questions] Mixing casts and calls

James Aimonetti james@REDACTED
Tue Jan 21 23:06:55 CET 2014


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

You can call gen_server:reply/2 directly from the spawned process,
afaik. No need to send the response back to the gen_server to do the
reply.

...
spawn(fun() ->
  gen_server:reply(From, cnode_handler:call(what_version, CNode))
end),
...

On 01/21/2014 02:02 PM, Ludovic Demblans wrote:
> To preserve the from argument you could just, in your handle_call,
> spawn a process :
> 
> 
> handle_call(what_version, From, State=#state{cnode=CNode}) -> Self
> = self(), spawn(fun() -> Reply = cnode_handler:call(what_version,
> CNode), Self ! {cnode_reply,Reply,From} end), {noreply, State}.
> 
> handle_info({cnode_reply, Reply, From},State) -> 
> gen_server:reply(From,Reply), {noreply,State}.
> 
> 
> Seems it could work.
> 
> 
> 
> Le Fri, 17 Jan 2014 10:27:58 +0100, Daniel Abrahamsson 
> <daniel.abrahamsson@REDACTED> a écrit:
> 
>> Assuming your Erlang node handles the RPC call from the Java node
>> with a gen_server, why not respond with {no_reply, ...} to the
>> Java-server, send an asynchronous request to the C-server, handle
>> the response in a handle_info, and then reply to the Java-server
>> with gen_server:reply/2? This way, you leave all the timeout
>> handling to the Java-node.
>> 
>> The issue with this approach is that you must find a way to
>> preserve the From argument to your handle_call callback, so that
>> you can pass it on to gen_server:reply/2 at a later stage, but
>> that might be an easier problem to solve.
>> 
>> //Daniel
>> 
>> 
>> On Fri, Jan 17, 2014 at 10:17 AM, David Welton 
>> <davidnwelton@REDACTED>wrote:
>> 
>>> Hi,
>>> 
>>> I am working with a system that looks like this:
>>> 
>>> C node <=======> Erlang <========> Java Node
>>> 
>>> And we're looking at good ways to integrate everything.
>>> 
>>> For instance, we want the Java node to be able to do a simple
>>> query that ends up getting some data from the C node, say, the
>>> version it's running or something like that.
>>> 
>>> Since the Java code needs to be simple, we want to do the
>>> equivalent of rpc:call(hw_server, get_version, []) and wait for
>>> the answer. It shouldn't take long, and timeouts or whatever
>>> can be handled by Java in that case.
>>> 
>>> However, to interact with the C node, the gen_server that
>>> manages it would want to do something like:
>>> 
>>> {any, 'c@REDACTED'} ! get_version
>>> 
>>> And then get the answer via handle_info.
>>> 
>>> But if we're going to transform what is essentiall a 'call' - 
>>> hw_server:get_version() - into a cast/response, somewhere
>>> there's got to be a receive.  For instance:
>>> 
>>> get_version() -> Ref = make_ref(), gen_server:cast(hw_server,
>>> {get_version, Ref}), receive {Ref, version, Version} -> 
>>> Version end
>>> 
>>> This feels like I've left OTP behind though.
>>> 
>>> We could put the receive in the handle_cast for the gen_server,
>>> but then that's going to block the whole thing on one call,
>>> which strikes me as a bad idea, although I guess it could also
>>> be used to protect the C node if it were unable to process more
>>> than one thing at once.
>>> 
>>> Another approach would be to further work with our Java guy to
>>> have him send and receive the messages, but we were kind of
>>> hoping to hide some of the complexity from that part of the
>>> system.
>>> 
>>> Thank you, -- David N. Welton
>>> 
>>> http://www.welton.it/davidw/
>>> 
>>> http://www.dedasys.com/ 
>>> _______________________________________________ 
>>> erlang-questions mailing list erlang-questions@REDACTED 
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>> 
> 
> 


- -- 
James Aimonetti
Lead Systems Architect
"I thought I fixed that"

2600Hz | http://2600hz.com
sip:james@REDACTED
tel:415.886.7905
irc:mc_ @ freenode
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iF4EAREIAAYFAlLe738ACgkQ54NxaUq7OmCnzwD+JmvOrFAhvuMnoTOkGwEzUvOw
0WwjnwmZbCMvRCnrTN4A/1QHZC7Z+36B0qsiglOs3SKlen0QexYGk0Fyak9Ol4CX
=cYK7
-----END PGP SIGNATURE-----



More information about the erlang-questions mailing list