我们知道,erlang在开源社区的活跃度远远不及java社区,在java社区中有很多优秀的开源框架,比如mybatis、hibernate、 springboot、hadoop、hbase等,为了让erlang和java社区的众多开源框架相结合,让他们优势互补,可以让erlang来调用java写的中间件。

erlang与java构建的节点通讯

引入依赖包:

 <!-- https://mvnrepository.com/artifact/org.erlang.otp/jinterface -->
<dependency><groupId>org.erlang.otp</groupId><artifactId>jinterface</artifactId><version>1.6.1</version>
</dependency>

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)); // 原消息返回//mbox.send("erl_node_name","erl_node@127.0.0.1",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> register(erl_node_name, self()).
true
(erl_node@127.0.0.1)2> {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)3> 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

erlang与java构建的节点通讯相关推荐

  1. Erlang与C构建的节点通讯

    Erlang节点之间的通讯,主要用于两个Erlang节点之间的通讯,但Erlang还支持与java构建的节点通讯,甚至与c构建的节点通讯,前面两种方式在我以前的文章都有讲到,所以这里讲Erlang与c ...

  2. Java构建递归树工具类

    Java构建树结构工具类 import java.util.ArrayList; import java.util.List;public interface TreeUtil {/*** 节点树抽象 ...

  3. java 幻影_幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统

    Phantom-Platform 介绍 幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统. 提供支持单聊.群聊.SDK等通用的技术通讯组件,开箱即用. 软件架构 构建 项目 ...

  4. java+构建+工具+Ant+Maven+Gradle

    java+构建+工具+Ant+Maven+Gradle Ant+Maven+Gradle+............ 目前: Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. M ...

  5. java操作dom节点的添加_java操作DOM节点的添加,删除,修改

    java操作DOM节点的添加,删除,修改 下面我们开始对此xml添加,删除,修改:方法一 import java.io.File; import java.io.IOException; import ...

  6. Erlang vs Java memory architecture (zz)

    转载自 http://www.javacodegeeks.com/2011/04/erlang-vs-java-memory-architecture.html I read a really, re ...

  7. 云效 Flow——Java构建并通过云效上传二方库到 Maven 私有仓库

    解决方案 当用户开通了 Maven 私有仓库服务后,云效会为用户生成两个私有仓库,一个用于存放 release 版本的二方库,一个用于存储 SNAPSHOT 版本的二方库. Release 仓库地址示 ...

  8. Erlang与java的内存架构比较

    http://blog.sina.com.cn/s/blog_541086000100qod1.html 我读了一篇非常非常有趣的文章(Jesper Wilhelmsson的一篇论文),是关于Erla ...

  9. Java构建工具, ZeroC ICE, word2vec

    https://antkillerfarm.github.io/ Java构建工具 构建工具的意义在于,提供一种独立于IDE的软件构建方式.而且通常来说,构建工具更适合特大项目的构建.比如,即使是以功 ...

最新文章

  1. 三步快删EXCEL工作表下面出现1000多万行无用数据或者空白行(空值行)
  2. TxQueryRunner-JDBC小工具
  3. struts2中s:select标签的使用
  4. AI专利申请5年激增1.8倍
  5. 锐起无盘工作站的安装
  6. 修改斐讯k3天气服务器,夏天了,给斐讯K3换智能调温套件降降温
  7. 系统学习语义分割文章推荐以及顺序
  8. photoshop柔光模式原理和案例教程
  9. 轻松查询多个中通速递发出物流中含有某个城市的单号
  10. NLP实现文本分词+在线词云实现工具
  11. 账号、密码管理系统 python
  12. 骨传导耳机哪个牌子好?哪些款式最值得入手?
  13. [推荐]全球第一互动成人英语学习软件《ELLIS 英语培训系统》ISO下载
  14. 如何生成多个互不重叠的不同半径圆(逻辑)
  15. 其他网页可以使用,但百度首页打不开,百度搜索无法使用,怎么办
  16. html ide iOS,用于ios开发的ide是 ios开发的ide有哪些
  17. 80c51汇编语言程序案例指导,新第4章80C51的汇编语言程序设计
  18. 金融科技专业计算机课程,课程大纲-1819S1-互联网金融科技
  19. Windows Server 2003 R2 简体中文企业版(32位)
  20. 打开新窗口的几种方式及target=_blank指定窗口名称

热门文章

  1. 几个新员工培训的小问题
  2. 基于粒子群优化算法的分布式电源选址定容【IEEE33节点】(Matlab代码实现)
  3. 关于程序员35岁失业
  4. 用《人人都是产品经理》的思维做科研
  5. PHP如何使用免费在线客服插件
  6. 上传图片(基于vue3)
  7. iPhone屏幕尺寸、分辨率及适
  8. Spring-Springmvc-Mybatis框架整合
  9. C语言初阶-C语言中的数据类型以及变量的作用域和生命周期,常量的类型
  10. 使用 Hippo 进入 WebAssembly