`
yangyiqian
  • 浏览: 115155 次
  • 来自: ...
社区版块
存档分类
最新评论

Erlang与JAVA的交互操作

    博客分类:
  • JAVA
阅读更多
http://www.lupaworld.com/action-viewstutorial-itemid-10193.html
试了一下传说中的 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.     {echo, abc@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(echo, self()),
   7.     io:format("echo start~n", []),
   8.     loop().
   9. 
  10. loop() ->
  11.     receive
  12.         {Pid, Msg} ->
  13.             io:format("received ~p from ~p~n", [Msg, Pid]),
  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.       
  37.         System.out.println("send:"+text);
  38. 
  39.         try {
  40.           
  41.             OtpErlangObject reply = mbox.receive();
  42.           
  43.             System.out.println("receive[raw]:"+reply);
  44.           
  45.             if (reply instanceof OtpErlangString) {
  46.                 OtpErlangString text2 = (OtpErlangString) reply;
  47.               
  48.                 System.out.println("receive[text]:"+text2);
  49. 
  50.             }
  51.         } catch (Exception e) {
  52.             System.out.println("" + e);
  53.         }
  54.     }
  55. 
  56. }

下载: ErlangEchoServer.java

   1. package com.test.erlang;
   2. 
   3. import java.io.IOException;
   4. 
   5. import com.ericsson.otp.erlang.*;
   6. 
   7. public class ErlangEchoServer {
   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("server1", "123");
  15.       
  16.         System.out.println("node:"+self.node());
  17.         System.out.println("cookie:"+self.cookie());
  18.       
  19.         OtpMbox mbox = self.createMbox("echo");
  20.       
  21.         String[] names = self.getNames();
  22.         for(int i=0; i<names.length; i++) System.out.println("name:"+names[i]);
  23.       
  24.         while (true) {
  25.             try {
  26.                 OtpErlangObject request = mbox.receive();
  27.               
  28.                 System.out.println("receive[raw]:"+request);
  29.               
  30.                 if (request instanceof OtpErlangTuple) {
  31.                     OtpErlangTuple t = (OtpErlangTuple) request;
  32.                     OtpErlangPid pid = (OtpErlangPid) (t.elementAt(0));
  33.                     OtpErlangString text = (OtpErlangString) (t.elementAt(1));
  34.                   
  35.                     System.out.println("receive[text]:"+text);
  36.                   
  37.                     OtpErlangString response = text;
  38.                   
  39.                     mbox.send(pid, response);
  40.                 }
  41.             } catch (Exception e) {
  42.                 System.out.println("" + e);
  43.             }
  44.         }
  45.     }
  46. 
  47. }

这里有几个需要提示的地方。

1. OtpErlang.jar 里面会访问系统变量 OtpConnection.trace 当它不为 0 时会显示链底层的 debug 信息。在调试时,这个设置就像照妖镜,有啥妖怪问题,都给照出来了。

2. setcookie 很重要。我这里是明确指定 123 作为 cookie ,如果这个 cookie 不匹配(比如,最好用: erl -setcookie 123 来启动)两端就死活也连不上,尤其是当你没有把上面的 trace 打开的时候,那你就去找去吧。

3. epmd 是 erlang 通讯机制的基础。也就是说,运行的时候,至少需要有一个 epmd 在运行(实际上也只会有一个)。比如说 java client 调用 erlang server ,erlang client 调 java server ,erlang client 调 erlang server 都很正常的不会有问题。而如果你要 java client 调 java server 的时候,最好先确认一下系统中有 epmd 正在运行。否则就会很邪。而启动一个 epmd 的超简单方法就是打开一个 erlang 的 console ,什么也不干都行。

扩充话提:Java Node 是 Hidden Node,一般启动的 Erlang 程序都运行在非 hidden node 模式下。具体 Hidden Node 的区别超出了本日志的范围,大家自己啃文档吧(其实是我也没看得很透彻,就不误导大家了,哈哈)。

再来个体外话,有了 JInterface 就等于在 Java 和 Erlang 的世界之间架起了一座桥梁。通过这个桥梁能干吗呢?这个问题留给你自己去想。

分享到:
评论

相关推荐

    erlang-java聊天

    初级的erlang和Java交互的聊天代码

    jinterface

    erlang 和java1进行交互操作,实现了Java 和erlang进行相互调用

    积分java源码-CreditsCSharpDemo:在C#中使用CREDITSAPI

    C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml 高效无缝交互的服务和 Delphi 等语言。 使用 Credits API 支持创建和执行交易(在 C# 中) _ 交易字段...

    积分java源码-lookfor-api-csharp:寻找-api-csharp

    C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml 高效无缝交互的服务和 Delphi 等语言。 使用 Credits API 支持创建和执行交易(在 C# 中) _ 交易字段...

    七周七语言 mobi

    书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...

    七周七语言:理解多种编程范型.pdf

    书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...

    七周七语言

    书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...

    RabbitMQ 知识全面详解(值得珍藏)

    它使用Erlang语言编写,并且可以与多种编程语言进行交互,包括Java、.NET、C、Python等。RabbitMQ的核心概念包括生产者、消费者、队列和消息。生产者是发送消息的应用,消费者是接收消息的应用,队列是存储消息的...

    付款界面java源码-dgiot:数蛙工业物联网SaaS平台(IndustrySaaSforIoTPlatform)

    让丰富工程人员可以通过视窗交互可以完成需求较简单的工业互联网项目 让广大的初级前端工程师通过serverless的方式可以承接需求较复杂的工业互联网项目 让Python、Java、Go、C初级后台工程师通过web编程开发通道来...

    ASP EXCEL导入SQL

     平台服务层实现的都是共通的服务,服务之间是独立的,而且是插件式的方式来实现的,平台选用了面向分布式计算的Erlang语言来实现的,因此保证了这些插件式的服务能够热拔插地部署,实现真正地不宕机地部署与更新。...

    微博的搜索引擎优化价值分析等资料.rar

    2012-05-27 11:04 1,611,736 Erlang深度分析.pdf 2012-05-27 11:07 749,950 HTML5 Canvas 2D API 规范 1.0 中文版.pdf 2012-05-27 11:08 180,401 Java基础复习笔记05数据结构-栈.pdf 2012-05-27 11:05 834,613 ...

    资料合集.part2.rar

    2012-05-27 11:04 1,611,736 Erlang深度分析.pdf 2012-05-27 11:07 749,950 HTML5 Canvas 2D API 规范 1.0 中文版.pdf 2012-05-27 11:08 180,401 Java基础复习笔记05数据结构-栈.pdf 2012-05-27 11:05 834,613 ...

    资料合集.part1.rar

    2012-05-27 11:04 1,611,736 Erlang深度分析.pdf 2012-05-27 11:07 749,950 HTML5 Canvas 2D API 规范 1.0 中文版.pdf 2012-05-27 11:08 180,401 Java基础复习笔记05数据结构-栈.pdf 2012-05-27 11:05 834,613 ...

    springCloud

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...

Global site tag (gtag.js) - Google Analytics