[erlang-questions] link/1 appears to interfere with message sending
J David Eisenberg
jdavid.eisenberg@REDACTED
Tue Mar 19 19:13:19 CET 2013
On Tue, Mar 19, 2013 at 11:10 AM, Garret Smith <garret.smith@REDACTED> wrote:
> The Javadoc of OtpMsg.type() is what you're looking for.
>
> The Java node is receiving a notification of the process link. This message
> type has no "payload", so getMsg() fails with NPE. Before calling getMsg(),
> check the message type with msg.type().
>
Ah, that explains it! Thank you very much.
> -Garret Smith
>
>
> On Fri, Mar 15, 2013 at 11:15 PM, J David Eisenberg
> <jdavid.eisenberg@REDACTED> wrote:
>>
>> I have written a test program that connects Erlang and Java as follows:
>> 1) Erlang module spawns a Java program via open_port/2.
>> 2) Erlang then uses the port to send Java the Erlang node name.
>> 3) The Java program uses that information to open a connection to Erlang.
>> 4) Java sends back the pid of the Java program, then awaits a message
>> from Erlang
>> 5) Erlang sends back an acknowledgment to Java, and...
>> 6) Java sends back a final message to Erlang.
>>
>> Here is the Java code with debugging output in Test.java
>> //==========================
>> import com.ericsson.otp.erlang.*;
>> import java.io.BufferedInputStream;
>> import java.io.BufferedReader;
>> import java.io.InputStreamReader;
>>
>> public class Test
>> {
>> public static void main(String[] args)
>> {
>> OtpSelf self;
>> OtpConnection connection;
>> OtpPeer erlangPeer;
>> OtpErlangObject [] elements = new OtpErlangObject[2];
>> OtpMsg message;
>> OtpErlangObject obj;
>> OtpErlangTuple tuple;
>> OtpErlangPid erlangPid;
>> String erlangAtom;
>>
>> try
>> {
>> self = new OtpSelf("java");
>> BufferedReader input = new BufferedReader(new InputStreamReader(
>> System.in));
>> String erlNodeName = input.readLine();
>> System.err.println("Erlang node is |" + erlNodeName + "|\r");
>>
>> erlangPeer = new OtpPeer(erlNodeName);
>>
>> connection = self.connect(erlangPeer);
>> System.err.println("Connection to " + erlangPeer + " " +
>> connection + "\r");
>>
>> elements[0] = new OtpErlangAtom("sent_from_java");
>> elements[1] = connection.self().pid();
>> connection.send("testing", new OtpErlangTuple(elements));
>>
>> message = connection.receiveMsg();
>> System.err.println("Java received message " + message + "\r");
>> obj = message.getMsg();
>> tuple = (OtpErlangTuple) obj;
>> erlangAtom = ((OtpErlangAtom) tuple.elementAt(0)).atomValue();
>> erlangPid = (OtpErlangPid) tuple.elementAt(1);
>> System.err.println("Java received " + erlangAtom + " " +
>> erlangPid + "\r");
>>
>> connection.send("testing", new OtpErlangAtom("goodbye"));
>> }
>> catch (Exception e)
>> {
>> System.err.println("Java gets exception" + "\r");
>> e.printStackTrace(System.err);
>> }
>> }
>> }
>> //===========================
>>
>> And here is the Erlang module, test.erl:
>> %=====================
>> -module(test).
>> -export([go/0,test/0]).
>>
>> go() ->
>> Pid = spawn(?MODULE, test, []),
>> register(testing, Pid),
>> io:format("Erlang spawns test process with pid ~p~n", [Pid]),
>> process_flag(trap_exit, true),
>> Port = open_port({spawn, "java -cp
>> .:/usr/lib/erlang/lib/jinterface-1.5.6/priv/OtpErlang.jar:core.jar
>> Test"},
>> [{line, 256}]),
>>
>> % send my node name to the Java program.
>> port_command(Port, list_to_binary(atom_to_list(node()) ++ "\n" )),
>> test().
>>
>> test() ->
>> receive
>> % get the pid of the Java process
>> {Atom, Pid} ->
>> io:format("Erlang receives: ~p ~p~n", [Atom, Pid]),
>>
>> %%% link(Pid), % let me know if Java crashes..
>>
>> Pid ! {sent_from_erlang, self()}, % and send it a message
>> test(); % then wait for another message
>> Other ->
>> io:format("Erlang receives ~p~n", [Other])
>> end.
>> %======================
>>
>> This all works great until I uncomment the ilne with the %%%
>> link(Pid). If I do that, then, when I send the message to Java, it
>> says:
>>
>> java.lang.NullPointerException
>> at com.ericsson.otp.erlang.OtpMsg.getMsg(OtpMsg.java:212)
>> at Test.main(Test.java:39)
>>
>> If I link to the Port instead of the Pid, everything works. I'm
>> clearly overlooking some simple concept; what is it?
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>
>
More information about the erlang-questions
mailing list