- 浏览: 117335 次
- 来自: ...
文章分类
最新评论
-
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 2567现象:thinkpad T440P 无线网卡睡眠恢复后无法上网 ... -
myeclipse10.7.1注册及导出war异常的破解
2013-03-02 12:55 7一、原作者的破解程序在myeclipse10.7.1环境下测试 ... -
tcnative-1_dll下载地址
2012-04-09 22:31 1081tcnative-1.dll下载地址: http://arch ... -
转:权限的分类
2011-09-30 16:59 1077权限主要分两大类:一是功能权限,二是数据权限。 功能权 ... -
转:表单同时提交多条记录
2011-09-07 09:38 2507http://zhidao.baidu.com/questio ... -
立即行动 拯救JAVA
2011-04-02 09:12 827通过Oracle目前的各种行动,我可以肯定它会比微软更 ... -
转:java获取根路径有两种方式
2010-09-04 22:49 2476http://java.chinaitlab.com/net/ ... -
转:java等比例压缩图片
2010-08-24 15:03 2111http://hi.baidu.com/bdusnb/blog ... -
转:多路归并排序(远远大于内存的数据进行外排序)
2010-08-20 16:38 1895http://hi.baidu.com/qq350884961 ... -
转:两个字母搞定J2EE通用分页标签
2010-06-16 15:59 1421两个字母搞定J2EE通用分 ... -
系统中那些部分可以提取为公共部分?
2010-06-12 18:39 822我目前能想到的就是: 分页、上传、通用DAO层、控制层、数据字 ... -
转:Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2010-06-09 09:22 1116http://hi.baidu.com/vip099/blog ... -
c3p0 no bug but the windows xp have
2010-05-31 08:33 17225月30日,用了一天的时间在找一个c3p0的bug,但没有找到 ... -
转:如何利用eclipse实现批量修改文件的编码方式
2010-05-29 14:02 3500原文地址:http://dev.firnow.com/cour ... -
转载:教你彻底解决 Tomcat 5下文字乱码问题
2010-03-04 20:30 897http://tech.ccidnet.com/art/353 ... -
JDBC addbatch批量处理数据时有最大值限制
2009-12-27 13:29 7919在用jdbc向数据灌入数据时,发现120000的数据每次只能灌 ... -
网站如何赚钱
2009-05-28 13:30 609很多朋友,特别是对网 ... -
走进Java 7中的模块系统
2009-05-15 09:44 993http://developer.51cto.com/art/ ... -
MyEclipse7.1插件安装
2009-04-28 11:06 3571最近刚使用MyEclise 7.1 ,发现期插件安装与以前有所 ... -
Java的多进程运行模式分析
2009-04-25 21:05 1175一般我们在Java中运行其它类中的方法时,无论是静态调用,还是 ...
相关推荐
【Erlang与Java交互实现聊天程序】 在IT领域,Erlang和Java都是重要的编程语言,各有其独特的优点和应用场景。本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的...
首先,`Erlang`调用`Java`的主要工具是`Jinterface`,这是一个`Erlang`的标准库,它提供了与`Java`交互的接口。`Jinterface`允许`Erlang`进程和`Java`虚拟机(JVM)之间进行消息传递,实现跨语言的通信。 1. **设置...
5. **Erlang分布协议**:虽然Java本身不支持Erlang的分布协议,但有一些库如Jinterface允许Java程序与Erlang节点进行交互。Jinterface提供了Erlang term到Java对象的转换,并支持Erlang的分布式特性。 压缩包中的...
三、Erlang与Java交互 1. 通信协议:由于Erlang和Java是不同的语言,它们之间的通信需要一个明确的协议。这可能是一个自定义的基于TCP/IP的协议,或者使用标准的协议如HTTP、WebSockets等。 2. Erlang-Java桥接库...
标题中的"C#版ErlangOtp跨平台通信框架(Java版的转译)"指的是一个用C#语言实现的框架,其目标是提供与Erlang OTP系统进行跨平台通信的能力。Erlang OTP(开放电信平台)是Erlang编程语言的一个核心组件,它包含了一...
2. **进程模型**:Erlang的进程与操作系统进程不同,它们轻量级且独立,可以高效地进行并发执行。每个进程有自己的内存空间,通过消息传递进行通信,这样的模型有利于构建分布式系统。 3. **错误处理和容错**:...
本项目“基于Erlang的文件存储”就是这样一个尝试,它利用Erlang强大的并发处理能力和分布式特性,为服务端提供稳定的基础架构,而客户端则通过Java的Swing组件提供用户友好的交互界面。以下是对该项目中涉及的技术...
对于Java开发者,可以通过使用`spring-amqp`或者`rabbitmq-java-client`库来与RabbitMQ交互,实现消息的生产与消费。同时,了解Erlang OTP的基本概念和RabbitMQ的工作原理,有助于更好地利用这两个工具解决实际问题...
在Java环境中,RabbitMQ可以通过Java API(如RabbitMQ Java Client)进行集成,为Java开发者提供了与消息队列交互的便捷方式。 使用Erlang和RabbitMQ组合有以下关键知识点: 1. **Erlang并发模型**:Erlang采用轻...
6. **使用RabbitMQ**:了解基本的AMQP概念,如队列、交换机和绑定,然后通过各种编程语言的客户端库与RabbitMQ交互。例如,Python有pika库,Java有RabbitMQ Java Client,JavaScript有amqplib等。 在使用过程中,...
6. NCURSES库(用于Erlang的shell交互): ```bash sudo yum install -y ncurses-devel ``` 7. 可选:如果需要编译时支持Java,还需要JDK和Java开发库: ```bash sudo yum install -y java-1.8.0-openjdk-devel ```...
《gen_java:Erlang与Java交互的开源库解析》 在现代软件开发中,跨语言交互成为一种常态,尤其在分布式系统和并发处理领域,Erlang以其强大的并发能力和容错性受到青睐,而Java则以其丰富的库和成熟的生态系统广泛...
Erlang在Android上的应用可能需要一些特殊的工具或者库,如Erlang的Android绑定(如ErlyMobile或NIFs)来实现与Java代码的交互。 由于压缩包中只有一个名为"JSONTest"的文件,我们可以推断该文件可能是Erlang用于...
3. **集成性**:由于Erlang主要用于构建分布式系统,`erl_protobuffs`的设计考虑到了Erlang的通信模型,使得与其他Erlang进程的交互更为流畅,尤其适合处理大规模并发场景下的数据交换。 **使用erl_protobuffs** 1...
**Erlang与RabbitMQ详解** Erlang是一种由Ericsson公司开发的并发性、分布式和面向对象的编程语言,特别适用于构建高可靠性、容错性和可扩展性的系统。其设计灵感来源于函数式编程,使得Erlang在处理并发问题上表现...
在本书的前言中,还提到了Erlang的年龄,它与Perl语言诞生的年份相近,比C++年轻,但比Java年长。尽管如此,Erlang的活跃度和影响力在一段时间里似乎并不像它的同辈语言那样广泛。然而,由于其语言设计上的一些特性...
虽然RabbitMQ本身不直接支持JMS,但通过RabbitMQ的JMS客户端适配器,如rabbitmq-jms,可以让Java应用使用JMS API与RabbitMQ交互。这种方式可以让已使用JMS的Java应用轻松接入RabbitMQ,利用其强大的消息队列功能。 ...
6. **Erlang与protobuf的交互**:Erlang的并发和分布式特性使得protobuf成为实现高可用和高性能系统的一个理想选择。你可以使用protobuf在Erlang节点间交换消息,或者与其他支持protobuf的语言(如Java、Python等)...
开发者可以根据需求选择合适的方式与RabbitMQ交互。基本的使用流程包括: 1. 生产者:创建一个连接到RabbitMQ服务器的客户端,发布消息到指定的交换机。 2. 交换机:根据预设的路由规则(如Direct、Topic、Fanout或...