Javaで分散処理

Javaで分散処理する必要が生じたので、調査のメモ。今回は、以下のページを参考にCORBA+RMIで分散処理をしてみることにする。OSはUbuntu14.04。

クラウドで再注目の「分散コンピューティング」の常識

上記のリンク先の説明を読むと、Java SE 5以前は、クライアント側にスタブが、サーバ側にスケルトンが必要だったが、Java SE 5以降は不要になってJavaプログラムだけが必要な状況のようだ。

JBossToolsのインストール

JBoss EAPをダウンロードして、bin直下のrun.shを実行しようとすると、以下のエラーが出る。

$ ./run.sh 
./run.sh: 3: ./run.sh: Bad substitution

========================================================================================

To start a JBoss Enterprise Application Platform 6 Standalone Server, a single
server instance, use the command:

/home/sfchaos/Downloads/jboss-eap-6.3/bin/standalone.sh


To start a JBoss Enterprise Application Platform 6 Managed Domain, allowing control
and management of multiple instances, use the command:

/home/sfchaos/Downloads/jboss-eap-6.3/bin/domain.sh

そこで、ここではstandaloneモードで起動しよう。

$ ./standalone.sh

分散アプリケーションの実装

サーバ側は、次のように接続方法の定義し、その接続方法を用いた待ち受け状態にし、クライアントからのメソッド呼び出しの動作について設定する。

ServerClient.java

package remoting.server.test;

import org.jboss.remoting.InvokerLocator;
import org.jboss.remoting.transport.Connector;

public class SimpleServer {
    public static void main(String[] args) throws Exception {
        InvokerLocator myLocator = new InvokerLocator("socket://127.0.0.1:8080");
        Connector connector = new Connector();
        connector.setInvokerLocator(myLocator.getLocatorURI());
        connector.start();
 
        connector.addInvocationHandler("simpleSystem",new SimpleServerInvocationHandler());
 
        try {
            while (true) {
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

SimpleServerInvocator.java

package remoting.server.test;

import javax.management.MBeanServer;
import org.jboss.remoting.InvocationRequest;
import org.jboss.remoting.ServerInvocationHandler;
import org.jboss.remoting.ServerInvoker;
import org.jboss.remoting.callback.InvokerCallbackHandler;

/**
 * メソッド呼び出しのためのハンドラ
 */
public class SimpleServerInvocationHandler {
    /**
     * 受信したメッセージを処理し、メッセージを返却します。
     */
    public Object invoke(InvocationRequest invocation) {
        
        System.out.println(" request:「" + invocation.getParameter() + "」");
        
        return "ServerからClientへ";
    }
    public void addListener(InvokerCallbackHandler arg0) {
    }
 
    public void removeListener(InvokerCallbackHandler arg0) {
    }
 
    public void setInvoker(ServerInvoker arg0) {
    }
 
    public void setMBeanServer(MBeanServer arg0) {
    }	
}

一方で、クライアント側は次のように、リモート呼び出しが実行されるinvokeメソッドを実装して、呼び出し元へ処理結果を返す。

SimpleClient.java

package remoting.server.test;

import javax.management.MBeanServer;
import org.jboss.remoting.InvocationRequest;
import org.jboss.remoting.ServerInvocationHandler;
import org.jboss.remoting.ServerInvoker;
import org.jboss.remoting.callback.InvokerCallbackHandler;

/**
 * メソッド呼び出しのためのハンドラ
 */
public class SimpleServerInvocationHandler {
    /**
     * 受信したメッセージを処理し、メッセージを返却します。
     */
    public Object invoke(InvocationRequest invocation) {
        
        System.out.println(" request:「" + invocation.getParameter() + "」");
        
        return "ServerからClientへ";
    }
    public void addListener(InvokerCallbackHandler arg0) {
    }
 
    public void removeListener(InvokerCallbackHandler arg0) {
    }
 
    public void setInvoker(ServerInvoker arg0) {
    }
 
    public void setMBeanServer(MBeanServer arg0) {
    }	
}

あとは、このプログラムを実行すればO.K.