天天看點

利用jinterface在java和erlang節點之間通訊

     在分布式環境當中使用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代碼

<dependency>  

            <groupid>org.erlang.otp</groupid>  

            <artifactid>jinterface</artifactid>  

            <version>1.5.3.2</version>  

</dependency>  

寫一個receivemessage的類,專門來接收其他erlang節點發送過來的消息:

java代碼

import com.ericsson.otp.erlang.otpnode;  

<span style="white-space: normal; background-color: #ffffff;">import com.ericsson.otp.erlang.otpmbox;</span>  

public class receivemessage {  

    public static void main(string[] args) throws exception {  

        otpnode node = new otpnode("testt");  

        otpmbox mbox = node.creatembox();  

        mbox.registername("java");  

        system.out.println("start to listen.....");  

        while (true) {  

            system.out.println(mbox.receive());// 這裡和socket程式設計一樣也是阻塞式的  

        }  

    }  

}  

接下來需要啟動本機erlang node,注意,必須先啟動這個erlang節點,不然的話,如果先執行receivemessage類的main函數系統會抛出異常,原因是所有erlang節點之間的通訊都要依賴一個底層的empd的服務,這個子產品的主要功能是提供通過互相通過name來識别機器的機制(這個機制在分布式環境中非常重要,一般一個服務要向另外一個服務發送資料,系統為了穩定性,往往會通過一個名稱服務中間件,将name所對應的ip位址取得,然後再利用這個ip位址常見connection連接配接)。

啟動node:

ruby代碼

d:erlwork>erl -sname erlangside  

然後再執行receivemessage的main函數。 java 節點開始等待接收消息

在erlnag的控制台上寫一個 節點發送消息的腳本:

(erlangside@aliyun-18097n)3> {java,'testt@aliyun-18097n'}!{self(),"baisui"}.  

{<0.36.0>,"baisui"}  

java端就會接受到其發送過來的消息:

 start to listen.....   {#pid<[email protected]>,"baisui"}