[erlang-questions] : First send from JInterface ok, second one blocs??
Alexander Lamb
alexander.lamb@REDACTED
Tue May 13 11:33:47 CEST 2008
Le 13 mai 08 à 10:57, Raimo Niskanen a écrit :
> Since you gave no example code I give you counterexample code.
> I have done a simple RPC call example:
Well, this looks very close to what I am doing I start Erlang like that:
erl -mnesia -setcookie rodanotech -sname alex
I start Java (from Eclipse) with those arguments:
-Djetty.home="/Users/alamb/Library/jetty-5.1.14" -DOtpConnection.trace=4
When my app starts, I create a node like that:
_otpNode = new OtpNode(OTP_NODE_NAME,OTP_NODE_COOKIE);
with:
public static final String OTP_NODE_COOKIE = "rodanotech";
public static final String OTP_NODE_NAME = "jnode";
then I have a class wich creates a mailbox in its constructor:
_mbox = _node.createMbox();
Finally, I have a function which sends the message to the server:
private OtpErlangObject callFunctionInModuleOnNodeWithArgs(String
functionName,String moduleName,String nodeName,OtpErlangList args)
throws SFExceptionTimeout, SFExceptionError {
OtpErlangObject[] rpc = new OtpErlangObject[2];
OtpErlangObject[] call = new OtpErlangObject[5];
call[0] = new OtpErlangAtom("call");
call[1] = new OtpErlangAtom(moduleName);
call[2] = new OtpErlangAtom(functionName);
call[3] = args;
call[4] = new OtpErlangAtom("user");
rpc[0] = _mbox.self();
rpc[1] = new OtpErlangTuple(call);
OtpErlangObject response = null;
_mbox.send("rex", nodeName, new OtpErlangTuple(rpc));
System.out.println("--- message sent");
try {
response = _mbox.receive(_timeout);
System.out.println("--- message received: " + response);
} catch(Exception e) {
System.out.println("*** Error receiving message" + e);
e.printStackTrace();
throw new SFExceptionError(e.getMessage());
}
if(response == null)
throw new SFExceptionTimeout();
try {
response =
((com.ericsson.otp.erlang.OtpErlangTuple)response).elementAt(1); //
skip "rex"
OtpErlangAtom status = (OtpErlangAtom)
((com.ericsson.otp.erlang.OtpErlangTuple)response).elementAt(0);
response =
((com.ericsson.otp.erlang.OtpErlangTuple)response).elementAt(1);
if(status.atomValue().equals("error"))
throw new SFExceptionError(response.toString());
} catch(Exception e) {
System.out.println("*** Error decoding message" + e);
e.printStackTrace();
throw new SFExceptionError(e.getMessage());
}
return response;
}
Now, the problem is that it works fine the FIRST TIME I call this
function... but the second time it doesn't and the call doesn't even
reach my function in Erlang (I added a trace).
So it can't be a cookie problem since otherwise it would not even
accept a first connection. Something is doing a "close". Should I do
somthing special on the Erlang or Java side to make the connection
persistent?
Here is the trace:
--- TEST START...
--- INIT OF SESSION...
--- App module init...
-> PUBLISH (r4) jnode@REDACTED port=57107
<- OK
-> LOOKUP (r4) alex@REDACTED
<- PORT 57102
-> MD5 CONNECT TO kirk.local:57102
-> HANDSHAKE sendName flags=3332 dist=5 local=jnode@REDACTED
<- HANDSHAKE recvStatus (ok) local=jnode@REDACTED
<- HANDSHAKE recvChallenge from=alex@REDACTED challenge=-41504799
local=jnode@REDACTED
-> HANDSHAKE sendChallengeReply challenge=-1539340064
digest=0f7f9711c77b2b1a28c0fab48b502046 local=jnode@REDACTED
<- HANDSHAKE recvChallengeAck from=alex@REDACTED
digest=b04515d124bdaa99e579ebaaa88079d4 local=jnode@REDACTED
-> REG_SEND {6,#Pid<jnode@REDACTED>,'',rex}
{#Pid<jnode@REDACTED>,{call,profiles,get_default_menus,
[[84,79,80]],user}}
--- message sent
<- SEND {2,'',#Pid<jnode@REDACTED>}
{rex,{ok,[{menu,home,{{home,"Home"},[{login,"Login"},
{logout,"Logout"},{about,"About"}]}},{menu,patients,
{{patients,"Patients"},[]}},{menu,centers,{{centers,"Centers"},
[{search,"Search"},{list,"List"}]}},{menu,dashboard,
{{dashboard,"Dashboard"},[{enrollment,"Enrollment"},
{statistics,"Statistics"},{initiation,"Initiation"}]}}]}}
--- message received: {rex,{ok,[{menu,home,{{home,"Home"},
[{login,"Login"},{logout,"Logout"},{about,"About"}]}},{menu,patients,
{{patients,"Patients"},[]}},{menu,centers,{{centers,"Centers"},
[{search,"Search"},{list,"List"}]}},{menu,dashboard,
{{dashboard,"Dashboard"},[{enrollment,"Enrollment"},
{statistics,"Statistics"},{initiation,"Initiation"}]}}]}}
--- MSG: [{menu,home,{{home,"Home"},[{login,"Login"},{logout,"Logout"},
{about,"About"}]}},{menu,patients,{{patients,"Patients"},[]}},
{menu,centers,{{centers,"Centers"},[{search,"Search"},{list,"List"}]}},
{menu,dashboard,{{dashboard,"Dashboard"},[{enrollment,"Enrollment"},
{statistics,"Statistics"},{initiation,"Initiation"}]}}]
-> LOOKUP (r4) alex@REDACTED
<- PORT 57102
-> MD5 CONNECT TO kirk.local:57102
-> HANDSHAKE sendName flags=3332 dist=5 local=jnode@REDACTED
-> CLOSE
--- message sent
--- message received: null
**** EXCEPTION: ch.rodano.erl_jfoundations.model.SFExceptionTimeout
More information about the erlang-questions
mailing list