- PR -

LinuxによるRMIサーバ起動時のException

投稿者投稿内容
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-01-18 21:08
現在RedHat Linux9にてRMIの実験をしております。
まず「RMI 入門」 http://java.sun.com/j2se/1.3/ja/docs/ja/guide/rmi/getstart.doc.html
に従いサンプルコードを実行するところからはじめましたが、早くも行き詰ってしまいました。
WindowsXP環境では実行例通りうまくいったのですが、RedHat Linux9ではうまくいきません。

OS:RedHat Linux 9
Server:Tomcat5
SDK:J2SDK1.4.2_06 RPMパッケージ

rmiregistry &

を実行した後
サーバを起動する段階

[root@tdb1 classes]# java -Djava.rmi.server.codebase=file:/usr/tomcat/tomcat5/webapps/ROOT/WEB-INF/classes/ -Djava.security.policy=/usr/tomcat/tomcat5/webapps/ROOT/WEB-INF/classes/examples/hello/policy examples.hello.HelloImpl

を実行すると以下のExceptionが発生します。

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.net.SocketException: Connection reset
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:203)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:350)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:160)
at examples.hello.HelloImpl.main(HelloImpl.java:28)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:183)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:222)
at java.io.BufferedInputStream.read(BufferedInputStream.java:277)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2150)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2163)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2631)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:734)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
at sun.rmi.server.MarshalInputStream.<init>(MarshalInputStream.java:110)
at sun.rmi.transport.ConnectionInputStream.<init>(ConnectionInputStream.java:38)
at sun.rmi.transport.StreamRemoteCall.getInputStream(StreamRemoteCall.java:111)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:197)
... 4 more


HelloImplのソースコードは以下の通りです。


package examples.hello;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject
implements Hello {

public HelloImpl() throws RemoteException {
super();
}

public String sayHello() {
return "Hello World!";
}

public static void main(String args[]) {

// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
HelloImpl obj = new HelloImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("//localhost/HelloServer", obj);
System.out.println("HelloServer bound in registry");
} catch (Exception e) {
e.printStackTrace();
// System.out.println("HelloImpl err: " + e.getMessage());
// e.printStackTrace();
}
}
}



なにか少しでもわかる事がございましたら、ご教示ください。
お願いいたします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-01-19 06:22
おちゃさん、こんにちは。

あまり詳しくないのですが、
Namingはいきなり rebind()するものなのでしょうか。
bind()でなくて良いのですか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-01-19 12:31
rmiregistryがポート1099で待機していることは確認できてますか?
1099ポートの使用権限の無いユーザーでrmiregistryを起動しちゃった
とか、あるいは他のプロセスが使用中だったとか…

rmiregistryが使用するポート番号は変更可能ですので、変更して
みても良いかと思います。
そのときは、bind()する側でNamingのstaticメソッドを使用せず、
LocateRegistry.getRegistry(ポート番号).rebind()
としてください。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-01-19 16:10
Kissingerさん、ご返答ありがとうございます。
念のためbind()で実行してみましたが、状態は変わりませんでした。

シュンさん、ご返答ありがとうございます。
Linuxにはroot権限で入っています。
クライアントとして使っているWindows機からSuperScan4というポートスキャンソフトで
Linuxサーバ側に1099にRMI Serverが待機していることを確認いたしました。

rmiregistryの使用するポート番号を変更してみました。
LocateRegistry.getRegistry(8088).rebind("//localhost/HelloServer", obj);
とか
LocateRegistry.getRegistry(8088).rebind("/HelloServer", obj);
をやってみましたが変化はありませんでした。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-01-19 18:28
なんだか環境のほうを疑い始めています。
glibcのバージョン依存とかってあるのですか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-01-19 18:53
あう、ぜんぜん分かりませんです。

あとありえそうなのは、rmiregistryモジュールのバージョンとbind操作を行う側のJREのバージョンが合っていないか何かで、バインド操作の通信プロトコルがかみ合ってないとか…
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-01-19 19:29
シュンさん、ありがとうございます。

java -version
で調べたところ
build1.4.2_06_b03
です。
古いJREが走っている形跡はありませんでした。
おちゃ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 25
投稿日時: 2005-01-19 19:31
NPTLって関係ないでしょうか?

http://java.sun.com/developer/technicalArticles/JavaTechandLinux/RedHat/

スキルアップ/キャリアアップ(JOB@IT)