我们知道,erlang在开源社区的活跃度远远不及java社区,在java社区中有很多优秀的开源框架,比如struts、hibernate、 spring、hadoop、hbase等,为了让erlang和java社区的众多开源框架相结合,让他们优势互补,可以让erlang来调用java写的中间件。
erlang提供了一个Jinterface代码包,java可以和erlang建立节点通信。通过这种方式,erlang可以将 java构建的节点也当作erlang的一个节点,java可以接收erlang传过来的消息,并且处理之后以异步的方式发送处理结果。
erlang与java构建的节点通讯
安装erlang后,可以在安装目录找到这个Jinterface代码包OtpErlang.jar,路径是 erl5.10.3\lib\jinterface-1.5.8\priv\OtpErlang.jar
Java的代码如下:
package erljava;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangPid;
import com.ericsson.otp.erlang.OtpErlangTuple;
import com.ericsson.otp.erlang.OtpMbox;
import com.ericsson.otp.erlang.OtpNode;
public class ErlJavaNode{
public static void main(String[] args) throws Exception {
String cookie = "123456";
OtpNode node = new OtpNode("java_node@127.0.0.1", cookie);
OtpMbox mbox = node.createMbox();
mbox.registerName("java_node_name");
System.out.println("java node start");
OtpErlangObject o;
OtpErlangTuple msg;
OtpErlangPid from;
while (true) {
try {
o = mbox.receive();
System.out.println("recv:" + o);
if (o instanceof OtpErlangTuple) {
msg = (OtpErlangTuple) o;
from = (OtpErlangPid) (msg.elementAt(0));
mbox.send(from, msg.elementAt(1)); // 原消息返回
}
} catch (Exception e) {
System.out.println("" + e);
}
}
}
}
erlang给java节点发送消息:
C:\>erl -name erl_node@127.0.0.1 -setcookie 123456
Eshell V5.10.3 (abort with ^G)
(erl_node@127.0.0.1)1> {java_node_name,'java_node@127.0.0.1'} ! {self(),{a,bc,d}}.
{<0.37.0>,{a,bc,d}}
(erl_node@127.0.0.1)2> flush().
Shell got {a,bc,d}
ok
分析erlang与java节点无法通讯
1、epmd服务未启动
先在本机启动一个erlang节点,没有的话,如果先执行Java代码系统会抛出异常。原因是所有erlang节点之间的通讯都要依赖一个底层的epmd的服务,这个模块的主要功能是提供通过相互通过name来识别机器的机制。这个机制类似dns功能,先通过一个名称服务中间件,使用name获取所对应的ip地址,然后再利用这个ip地址建立连接。
另一种方式是手动启动epmd服务,在erlang安装目录下找到epmd进程,执行命令 epmd -daemon
2、erlang版本不一致
java使用的OtpErlang包和shell使用的erlang版本不一致,erlang是不允许主版本不同的erlang节点进行连接。
erlang与java节点通讯的好处
erlang节点通讯也是依靠socket实现的,虽然erlang和java可以直接用socket连接,但使用节点通讯的有很多好处,和erlang节点通讯一样,支持erlang所有的数据结构,而且还不用定义传输协议,多节点通讯也会变得复杂。做成erlang节点,能极大程度利用到erlang分布式的好处。
java判断erlang节点是否连接成功
if (node.ping("erl_node@127.0.0.1", 2000)) {
System.out.println("connect ok");
} else {
System.out.println("connect fail");
}
java主动与erlang节点通讯实例
前面说到是erlang连接java节点的情况,现在讨论java主动连接erlang节点的情况。
erlang建立节点,注册进程名字
C:\>erl -name erl_node@127.0.0.1 -setcookie 123456
Eshell V5.10.3 (abort with ^G)
(erl_node@127.0.0.1)1> register(erl_node_name, self()).
true
java代码如下:
package erljava;
import com.ericsson.otp.erlang.OtpConnection;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangTuple;
import com.ericsson.otp.erlang.OtpPeer;
import com.ericsson.otp.erlang.OtpSelf;
public class ErlJavaNode {
public static void main(String[] args) throws Exception {
String cookie = "123456";
OtpSelf self = new OtpSelf("java_node@127.0.0.1", cookie);
OtpPeer other = new OtpPeer("erl_node@127.0.0.1");
OtpConnection connection = self.connect(other);
System.out.println("java node start");
if (connection.isConnected()) {
System.out.println("connect ok");
OtpErlangObject[] msg = new OtpErlangObject[2];
msg[0] = self.pid();
msg[1] = new OtpErlangAtom("hello, world");
OtpErlangTuple tuple = new OtpErlangTuple(msg);
connection.send("erl_node_name", tuple);
} else {
System.out.println("connect fail");
}
}
}
erlang刷新信箱,就可以看到java发来的消息:
(erl_node@127.0.0.1)2> flush().
Shell got {<6872.1.0>,'hello, world'}
ok
参考:
http://blog.csdn.net/mycwq/article/details/38448813
http://mozhenghua.iteye.com/blog/1685039
http://www.erlang.org/doc/apps/jinterface/jinterface_users_guide.html
分享到:
相关推荐
3. **建立连接**:`Jinterface`使用`Erlang`的分布式节点概念来与`Java`建立连接。你需要在`Java`端创建一个`Erlang`节点对象,然后在`Erlang`端使用`spawn_link`或`spawn_opt`创建一个链接到`Java`的进程。 4. **...
5. **Erlang分布协议**:虽然Java本身不支持Erlang的分布协议,但有一些库如Jinterface允许Java程序与Erlang节点进行交互。Jinterface提供了Erlang term到Java对象的转换,并支持Erlang的分布式特性。 压缩包中的...
标题中的"C#版ErlangOtp跨平台通信框架(Java版的转译)"指的是一个用C#语言实现的框架,其目标是提供与Erlang OTP系统进行跨平台通信的能力。Erlang OTP(开放电信平台)是Erlang编程语言的一个核心组件,它包含了一...
本项目提供了一个使用Erlang编写的聊天室服务器端代码以及Java编写的客户端代码,这为我们深入理解Erlang的并发特性和Java与Erlang的交互提供了实践案例。 一、Erlang聊天室服务器端 1. 并发处理:Erlang的轻量级...
8. **Erlang与其他技术的集成**:Erlang可以与其他语言如Java、Python等集成,用于构建混合系统。例如,使用Erlang的Ranch和Cowboy库可以构建高性能的Web服务器和API。 9. **实时性与并发性**:Erlang的实时性使其...
综上所述,这个基于Erlang的文件存储项目结合了Erlang的强大并发和分布式能力以及Java的桌面应用开发优势,构建了一个用户友好、可扩展的文件服务系统。通过对Erlang gen_server的运用和Java Swing组件的集成,实现...
总结来说,Erlang 25.2.3和RabbitMQ Server 3.11.9是用于构建高效、可靠的分布式消息系统的重要工具,尤其在Java开发中,它们能够帮助我们实现灵活的异步通信,提高系统的可扩展性和稳定性。通过深入学习和实践,...
2. **分布式计算**:Erlang天生支持分布式计算,节点间通信简单高效,可以在多台机器上构建分布式应用。 3. **容错性**:Erlang的错误处理机制鼓励“失败即恢复”(fail-stop)策略,当一个进程出错时,它会立即...
Erlang是一种面向并发的、函数式编程语言,因其强大的分布式计算能力和容错性,被广泛应用于构建高可用性的系统,如RabbitMQ就是用Erlang编写的。 Erlang的特点在于其轻量级进程、热代码替换、以及内置的错误恢复...
3. **分布式特性**:Erlang的分布式特性使得构建分布式系统变得简单,RabbitMQ正是利用这一特性实现集群部署,从而提供跨节点的高可用性和负载均衡。 4. **性能优化**:Erlang 24.2版本可能包含对内存管理和垃圾...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。Erlang环境,如"opt_win64_21.1"版本,提供了在Windows平台上运行Erlang程序所需的基础组件...
10. **平台移植性**:Erlang可以运行在多种操作系统上,包括Windows和各种*nix系统,并可通过C节点(ei)、Java接口(jinterface)与其他语言集成。 在开发、测试和部署方面,Erlang提供了一系列工具,如开发环境、...
此外,Erlang的容错特性也使得RabbitMQ能够优雅地处理节点故障,保证了服务的连续性。 为了使用RabbitMQ,开发者需要了解基本的RabbitMQ概念,如exchange、queue、binding和message属性。同时,学习如何通过AMQP...
**正文** RabbitMQ是一个广泛使用的开源消息代理和队列服务器,它允许应用程序之间通过异步通信进行解耦。RabbitMQ的核心实现是...通过理解和掌握RabbitMQ与Erlang的结合,开发者可以构建出更加稳定、可扩展的系统。
Erlang 21.1是RabbitMQ 3.7.8版本所依赖的特定版本,这是因为不同的RabbitMQ版本可能与不同版本的Erlang存在兼容性问题。Erlang以其高可靠性、容错性和热升级能力而著名,这些特性使得它成为构建像RabbitMQ这样需要...
Erlang支持构建分布式系统,即由多个Erlang节点组成的网络。每个节点可以运行在一个单独的处理器上,节点间可以通过网络互相通信。这种分布式的架构设计使得应用程序可以轻松地扩展到多台计算机上,从而提高整体系统...
你可以使用protobuf在Erlang节点间交换消息,或者与其他支持protobuf的语言(如Java、Python等)进行通信。 7. **性能优化**:protobuf的优势在于其高效的序列化和反序列化算法,可以在保持数据紧凑的同时,快速地...
- **混合系统**:Erlang OTP可以与Java平台结合,构建混合系统,利用两者的优点,例如Java的库丰富度和Erlang的并发性能。 5. **Erlang-otp_win64_21-22压缩包内容** - 可能包含Erlang OTP的完整安装程序,包括...
标签"rabbitmq"、"erlang"和"java"暗示了RabbitMQ不仅与Erlang有关,还与Java生态系统紧密相连。RabbitMQ提供了多种语言的客户端库,包括Java,使得开发者可以方便地在Java应用中集成消息队列服务。 在压缩包的文件...