erlang talk to java

阅读更多

Erlang: Let’s talk to java

August 29th, 2007 :: jackyz
Goto comments Leave a comment

试了一下传说中的 JInterface ,使用 OtpErlang.jar 的整个过程其实非常简单,似乎比 JMS 的程序都简单。

首先,我们要用 java 实现的原始 erlang 程序如下,没错,就是巨简单的 echo ,我们的目标是要把它用 java 来改写,不仅写服务端,也要写客户端。

下载:  echo_client.erl
  1. -module(echo_client).
  2.  
  3. -export([run/0]).
  4.  
  5. run() ->
  6.     Msg = "Hello Echo!",
  7.     {echoabc@merlin} ! {self()Msg},
  8.     io:format("send ~p ~n"[Msg]),
  9.     receive
  10.         Res ->
  11.             io:format("received ~p ~n"[Res])
  12.     end.
下载:  echo_server.erl
  1. -module(echo_server).
  2.  
  3. -export([start/0]).
  4.  
  5. start() ->
  6.     register(echoself()),
  7.     io:format("echo start~n"[]),
  8.     loop().
  9.  
  10. loop() ->
  11.     receive
  12.         {PidMsg} ->
  13.             io:format("received ~p from ~p~n"[MsgPid]),
  14.             Pid ! Msg;
  15.         Any ->
  16.             io:format("received ~p ~n"[Any])
  17.     end,
  18.     loop().

写得并不严密,用了一堆硬编码,主要是个示例,就那么个意思,大家将就着看。

先说一下 JInterface 的一些基本概念。JInterface 的目的是:为 Java 提供一个包,使得 Java 程序在外部可以看起来就像一个标准的 Erlang Node 能以标准的 Erlang 方式与其他的节点进行通讯。它包装了 Erlang 节点之间分布式的通讯协议,编码解码,以及基本的 Erlang 操作,也就是 pid register send receive link unlink 等等,朴实无华。不过,作为两个语言之间的接口包,有了这些基本功能也就足够了。

根据 Erlang 的目录惯例, JInterface 的 Jar 在 ERLANG_HOME/lib/jinterface-x.x/priv 目录下,名字为 OtpErlang.jar 。注意,必须使用和你当前 Erlang 版本下的包,否则出了什么妖怪问题,别来问我,就算是问我,我也不知道该怎么办。:D 之前一直有一个误解,想当然的以为 JInterface 会用 JNI 什么的来实现,而自从碰过一次以后,对 JNI 这种“难以掌控”的东西总觉得有点畏难,所以,迟迟都没有动手,没想到,竟是纯 Java 实现的一个包。用起来方便,部署起来也漂亮。爽!

闲话休提,直接上代码得了。先是 Client 的代码。

下载:  ErlangEchoClient.java
  1. package com.test.erlang;
  2.  
  3. import java.io.IOException;
  4.  
  5. import com.ericsson.otp.erlang.*;
  6.  
  7. public class ErlangEchoClient {
  8.    
  9.     public static void main(String[] args) throws IOException {
  10.        
  11.         String v =System.getProperties().getProperty("OtpConnection.trace");
  12.         System.out.println("OtpConnection.trace="+v);
  13.        
  14.         OtpNode self = new OtpNode("bcd""123");
  15.        
  16.         System.out.println("node:"+self.node());
  17.         System.out.println("cookie:"+self.cookie());
  18.        
  19.         if (self.ping("abc"2000)) {
  20.             System.out.println("remote is up");
  21.         } else {
  22.             System.out.println("remote is not up");
  23.             return;
  24.         }
  25.        
  26.         String text = "Hi there";
  27.        
  28.         OtpMbox mbox = self.createMbox();
  29.        
  30.         OtpErlangObject[] msg = new OtpErlangObject[2];
  31.         msg[0] = mbox.self();
  32.         msg[1] = new OtpErlangString(text);
  33.         OtpErlangTuple tuple = new OtpErlangTuple(msg);
  34.  
  35.         mbox.send("echo""abc"tuple);
  36. padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 20px; display: list-item !important; font-size: 12px !important; line-height: 20px !important; border-left-width: 1px; border-left-style: solid; border-left-color: #c3ced9; border-top-width: 1px; border-top-style: solid; border-top-color: #e3eef9 !important; background-color: #f9fbfc !impo

你可能感兴趣的:(Erlang,Java,JNI,JMS,UP)