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.