2011-09-16 2 views
1

によって返されるために、私はRMIのリモートインタフェースがあります。をシリアル化したMBeanServerConnection RMIのリモートメソッド

public interface JMXManager extends Remote { 

    public MFSMBeanServerConnection getMBeanServerConnection(String className) 
      throws RemoteException; 
    } 
} 

MFSMBeanServerConnectionMFSMBeanServerConnectionImpl私はMBeanServerConnectionををシリアル化するために作成された:オン

public interface MFSMBeanServerConnection extends Serializable { 
    public MBeanServerConnection getMBeanServerConnection(); 
} 

public class MFSMBeanServerConnectionImpl implements MFSMBeanServerConnection { 

    private static final long serialVersionUID = 1006978249744538366L; 
    /** 
    * @serial 
    */ 
    private MBeanServerConnection mBeanServerConnection; 

    public MFSMBeanServerConnectionImpl() {} 

    public MFSMBeanServerConnectionImpl(MBeanServerConnection mBeanServerConnection) { 
     this.mBeanServerConnection = mBeanServerConnection; 
    } 

    public MBeanServerConnection getMBeanServerConnection() { 
     return mBeanServerConnection; 
    } 

    private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, 
      IOException { 
     aInputStream.defaultReadObject(); 
     mBeanServerConnection = (MBeanServerConnection) aInputStream.readObject(); 
    } 

    private void writeObject(ObjectOutputStream aOutputStream) throws IOException { 
     aOutputStream.defaultWriteObject(); 
     aOutputStream.writeObject(mBeanServerConnection); 
    } 

    private void readObjectNoData() throws ObjectStreamException { 

    } 
} 

をクライアント側私が持っている

JMXManager jmxm= (JMXManager) registry.lookup("JMXManager"); 
MFSMBeanServerConnection mfsMbsc = jmxm.getMBeanServerConnection(className); 

on the seco NDラインは、私は例外を取得:

  • は、クライアントが1 MBeanServerConnectionをを取る彼らのMBeanServerConnectionを格納する1台のまたは複数のJMXサーバ
  • によって使用されます。

    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) 
    at $Proxy0.getMBeanServerConnection(Unknown Source) 
    

    私の目標は、RMIサーバーを作成することですそのMBeanを使用(操作)する

私は間違っていますか? javax.management.MBeanServerConnectionをシリアル化して、リモートインタフェースで使用できるようにするにはどうすればよいですか?

答えて

1

MBeanServerConnectionを直列化するのは悪い考えです。なぜなら、多くの実行時間情報/デシリアライズ時に使用できない、または有効ではない情報を格納することになっているからです。

既知のすべてのSubInterfaces(MBeanServer、MBeanServerForwarder)もSerializableを実装していないのはその理由だと思います。

関連する問題