- 浏览: 115155 次
- 来自: ...
文章分类
最新评论
-
x影千绝:
...
JDBC addbatch批量处理数据时有最大值限制 -
hunnuxiaobo:
为什么呢?
JDBC addbatch批量处理数据时有最大值限制 -
天涯海角tour:
是啊? 我在7.1下就装不上jbpm4.4,按你这着方法
MyEclipse7.1插件安装 -
t8500071:
原来exec后是子进程,怪不得我怎么看都不像是一个完全独立的进 ...
Java的多进程运行模式分析 -
海阔天空love:
很实用 。。。能给个例子吗?
现有的Web打印控制技术分成几种方案
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 的世界之间架起了一座桥梁。通过这个桥梁能干吗呢?这个问题留给你自己去想。
试了一下传说中的 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 的世界之间架起了一座桥梁。通过这个桥梁能干吗呢?这个问题留给你自己去想。
发表评论
-
thinkpad T440P 无线网卡睡眠恢复后无法上网故障的解决
2014-08-06 23:54 2486现象:thinkpad T440P 无线网卡睡眠恢复后无法上网 ... -
myeclipse10.7.1注册及导出war异常的破解
2013-03-02 12:55 7一、原作者的破解程序在myeclipse10.7.1环境下测试 ... -
tcnative-1_dll下载地址
2012-04-09 22:31 1017tcnative-1.dll下载地址: http://arch ... -
转:权限的分类
2011-09-30 16:59 1037权限主要分两大类:一是功能权限,二是数据权限。 功能权 ... -
转:表单同时提交多条记录
2011-09-07 09:38 2440http://zhidao.baidu.com/questio ... -
立即行动 拯救JAVA
2011-04-02 09:12 789通过Oracle目前的各种行动,我可以肯定它会比微软更 ... -
转:java获取根路径有两种方式
2010-09-04 22:49 2433http://java.chinaitlab.com/net/ ... -
转:java等比例压缩图片
2010-08-24 15:03 2068http://hi.baidu.com/bdusnb/blog ... -
转:多路归并排序(远远大于内存的数据进行外排序)
2010-08-20 16:38 1861http://hi.baidu.com/qq350884961 ... -
转:两个字母搞定J2EE通用分页标签
2010-06-16 15:59 1396两个字母搞定J2EE通用分 ... -
系统中那些部分可以提取为公共部分?
2010-06-12 18:39 785我目前能想到的就是: 分页、上传、通用DAO层、控制层、数据字 ... -
转:Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2010-06-09 09:22 1082http://hi.baidu.com/vip099/blog ... -
c3p0 no bug but the windows xp have
2010-05-31 08:33 16855月30日,用了一天的时间在找一个c3p0的bug,但没有找到 ... -
转:如何利用eclipse实现批量修改文件的编码方式
2010-05-29 14:02 3475原文地址:http://dev.firnow.com/cour ... -
转载:教你彻底解决 Tomcat 5下文字乱码问题
2010-03-04 20:30 837http://tech.ccidnet.com/art/353 ... -
JDBC addbatch批量处理数据时有最大值限制
2009-12-27 13:29 7854在用jdbc向数据灌入数据时,发现120000的数据每次只能灌 ... -
网站如何赚钱
2009-05-28 13:30 609很多朋友,特别是对网 ... -
走进Java 7中的模块系统
2009-05-15 09:44 911http://developer.51cto.com/art/ ... -
MyEclipse7.1插件安装
2009-04-28 11:06 3536最近刚使用MyEclise 7.1 ,发现期插件安装与以前有所 ... -
Java的多进程运行模式分析
2009-04-25 21:05 1144一般我们在Java中运行其它类中的方法时,无论是静态调用,还是 ...
相关推荐
初级的erlang和Java交互的聊天代码
erlang 和java1进行交互操作,实现了Java 和erlang进行相互调用
C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml 高效无缝交互的服务和 Delphi 等语言。 使用 Credits API 支持创建和执行交易(在 C# 中) _ 交易字段...
C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml 高效无缝交互的服务和 Delphi 等语言。 使用 Credits API 支持创建和执行交易(在 C# 中) _ 交易字段...
书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...
书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...
书中介绍了Ruby、Io、Prolog、Scala、Erlang、Clojure和Haskell这七种语言,关注每一门语言的精髓和特性,重点解决如下问题:这门语言的类型模型是什么,编程范式是什么,如何与其交互,有哪些决策构造和核心数据...
它使用Erlang语言编写,并且可以与多种编程语言进行交互,包括Java、.NET、C、Python等。RabbitMQ的核心概念包括生产者、消费者、队列和消息。生产者是发送消息的应用,消费者是接收消息的应用,队列是存储消息的...
让丰富工程人员可以通过视窗交互可以完成需求较简单的工业互联网项目 让广大的初级前端工程师通过serverless的方式可以承接需求较复杂的工业互联网项目 让Python、Java、Go、C初级后台工程师通过web编程开发通道来...
平台服务层实现的都是共通的服务,服务之间是独立的,而且是插件式的方式来实现的,平台选用了面向分布式计算的Erlang语言来实现的,因此保证了这些插件式的服务能够热拔插地部署,实现真正地不宕机地部署与更新。...
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 ...
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 ...
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 ...
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展...