利用jinterface在java和erlang节点之间通讯

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介:      在分布式环境当中使用erlang语言来构建底层应用,利用erlang的简洁的脚本语言可以简化代码的复杂度,并且还能很大程度地提高系统的容错性和稳定性。 erlang固然有他的优势,但是,它在开源社区开发人员的活跃性远远不及java社区,在java社区中,在分布式场景中使用的中间件,比如,

     在分布式环境当中使用erlang语言来构建底层应用,利用erlang的简洁的脚本语言可以简化代码的复杂度,并且还能很大程度地提高系统的容错性和稳定性。

erlang固然有他的优势,但是,它在开源社区开发人员的活跃性远远不及java社区,在java社区中,在分布式场景中使用的中间件,比如,memecached 还有hadoop 的hsfs 等都能非常完美地解决分布式环境中的常见问题。

为了让erlang这个工具和java社区的众多开源框架相结合,让他们优势互补。可以在生产环境中让erlang来调用java写的中间件。

erlang开源社区提供了一个jinterface代码包,通过它可以让java和erlang之间进行通信。通过这个方式,在erlang节点端可以将 java构建的节点看成就是一个erlang节点,可以接收erlang传过来的消息,并且处理之后以异步的方式将处理结果反馈。

下面介绍一下具体如何实现:

首先需要依赖jinterface包,在maven pom.xml中添加jinterface的依赖:

Xml代码
  1. <dependency>  
  2.             <groupId>org.erlang.otp</groupId>  
  3.             <artifactId>jinterface</artifactId>  
  4.             <version>1.5.3.2</version>  
  5. </dependency>  

写一个ReceiveMessage的类,专门来接收其他erlang节点发送过来的消息:

Java代码
  1. import com.ericsson.otp.erlang.OtpNode;  
  2. <span style="white-space: normal; background-color: #ffffff;">import com.ericsson.otp.erlang.OtpMbox;</span>  
  3.   
  4. public class ReceiveMessage {  
  5.   
  6.     public static void main(String[] args) throws Exception {  
  7.         OtpNode node = new OtpNode("testt");  
  8.   
  9.         OtpMbox mbox = node.createMbox();  
  10.         mbox.registerName("java");  
  11.         System.out.println("start to listen.....");  
  12.         while (true) {  
  13.             System.out.println(mbox.receive());// 这里和Socket编程一样也是阻塞式的  
  14.         }  
  15.     }  
  16. }  

接下来需要启动本机erlang node,注意,必须先启动这个erlang节点,不然的话,如果先执行ReceiveMessage类的main函数系统会抛出异常,原因是所有erlang节点之间的通讯都要依赖一个底层的EMPD的服务,这个模块的主要功能是提供通过相互通过name来识别机器的机制(这个机制在分布式环境中非常重要,一般一个服务要向另外一个服务发送数据,系统为了稳定性,往往会通过一个名称服务中间件,将name所对应的ip地址取得,然后再利用这个ip地址常见connection连接)。

启动node:

Ruby代码
  1. D:erlwork>erl -sname erlangside  

然后再执行ReceiveMessage的main函数。 java 节点开始等待接收消息

在erlnag的控制台上写一个 节点发送消息的脚本:

Xml代码
  1. (erlangside@aliyun-18097n)3> {java,'testt@aliyun-18097n'}!{self(),"baisui"}.  
  2. {<0.36.0>,"baisui"}  

java端就会接受到其发送过来的消息:

Xml代码
  1.  start to listen.....   {#Pid<erlangside@aliyun-18097n.36.0>,"baisui"}  

相关文章
|
5月前
|
Java
Java中ReentrantLock中部分加锁取消节点源码分析
Java中ReentrantLock中部分加锁取消节点源码分析
49 13
|
5月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
10月前
|
Java
24. 两两交换链表中的节点 -- 力扣 --JAVA
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
39 0
|
11月前
|
网络协议 Java
java通过dtu通讯进行modbus数据交换
java通过dtu通讯进行modbus数据交换
141 0
|
2月前
|
消息中间件 负载均衡 Java
Java微服务通讯方式有哪些?
【8月更文挑战第18天】Java微服务通讯方式有哪些?
31 1
|
2月前
|
设计模式 安全 Java
Java多线程通讯
这些机制都是多线程通信的关键,使用它们可以在Java中实现高效、安全的线程协作。在实现多线程通信时,需注意死锁、饥饿、竞态条件等多线程问题。确保对多线程的理解深入和正确的设计模式应用将会是编写稳健多线程程序的基础。
12 0
|
4月前
|
Java
java使用ServerSocket和Socket实现客户端与服务端通讯
java使用ServerSocket和Socket实现客户端与服务端通讯
|
5月前
|
缓存 Java
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
【JAVA学习之路 | 进阶篇】节点流与缓冲流(处理流之一)
|
4月前
|
Web App开发 分布式计算 大数据
MaxCompute操作报错合集之配置归并节点,出现java.lang.NullPointerException: null错误提示,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
5月前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
41 0