Сериализация MBeanServerConnection для возврата удаленным методом RMI - PullRequest
1 голос
/ 16 сентября 2011

У меня есть удаленный интерфейс RMI:

public interface JMXManager extends Remote {

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

MFSMBeanServerConnection и MFSMBeanServerConnectionImpl, которые я создал для сериализации 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);

во второй строке я получаю исключение:

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-сервер, который:

  • используется однимили более серверов JMX, которые хранят свои MBeanServerConnection
  • , клиент берет один MBeanServerConnection и использует (манипулирует) его MBeans

Что я делаю неправильно?Как я могу сериализовать javax.management.MBeanServerConnection, чтобы я мог использовать его с удаленным интерфейсом?

1 Ответ

1 голос
/ 16 сентября 2011

Я считаю плохой идеей сериализовать MBeanServerConnection, потому что он должен хранить много информации времени выполнения / некоторой информации, которая будет недоступна или недействительна при десериализации.

По этой причине все известные подинтерфейсы (MBeanServer, MBeanServerForwarder) также не поддерживают Serializable.

...