本文最后更新于:June 30, 2023 pm

本文作者:[wangwenhai] # 概要:本文主要讲EMQX和Java直连的过程。

1.背景概述

ErlangVm要求我们用Erlang编写代码,但是有时候我们可能对Erlang不熟悉或者是Erlang驱动太少,别担心,Erlang提供了一种接口技术,可以实现用Java来伪装成一个Erlang节点,从而实现ErlangVm的扩展。

The Jinterface package provides a set of tools for communication with Erlang processes. It can also be used for communication with other Java processes using the same package, as well as C processes using the Erl_Interface library.

2.基本概念

关于Java就不多讲了,我们说一下类型映射。Erlang的数据类型和Java是一一对应起来的,如下表所示:

image-20200418095915395

我们熟悉Java以后很容易可以利用这些基本数据类型和ErlangVm通信。

3.代码案例

下面展示一个很基础的Demo:

// 省略部分代码 
// 创建一个节点,名字为node1
OtpNode self = new OtpNode("node1");
    // 模拟Erlang创建一个进程 name是process1
    OtpMbox mbox = self.createMbox("process1");
    OtpErlangObject o;
    OtpErlangTuple msg;
    OtpErlangPid from;
    // 用一个循环来实现消息接受,这里有点像Socket通信
    while (true) {
      try {
        // 注意 这个方法是个阻塞方法,会一直卡在这里 直到消息到达
        o = mbox.receive();
        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);
      }
    }   
// 省略部分代码 

用java来实现一些计算型强的业务是一种很好的做法。

4.注意事项

因为Jinterface是用EPMD进行通信的,所以要把本机的EPMD打开,参考命令如下:

epmd -daemon

5.参考文档