java.rmi.UnmarshalException в вызове RMI
Пожалуйста, обратите внимание... вопрос был очищен после большого количества времени EJP. (Приношу искренние извинения и глубоко признателен за расширенную помощь.)
У нас есть клиент-серверное приложение. Сообщение является RMI. Мы получили следующее исключение в приложении только один раз. Программа работает уже более 5 лет, но исключение, упомянутое ниже, произошло только один раз в последнее время.
Исключение составляет
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.company.server.TestImplConcrete
at com.company.server.TopicSessionImpl_Stub.createPublisher(Unknown Source)
at com.company.process.finance.client.transactionservers.clientClass$TailorCalcManager.calc(clientClass.java:92)
at com.company.process.finance.client.transactionservers.clientClass$TailorCalcManager.access$500(clientClass.java:37)
at com.company.process.finance.client.transactionservers.clientClass.processTransaction(clientClass.java:346)
at com.company.process.finance.TransactionServer.processTransaction(TransactionServer.java:50)
at com.company.products.server.TransactionalProductManager.processTransaction(TransactionalProductManager.java:120)
at com.company.products.server.TransactionalProductManager.processTransaction(TransactionalProductManager.java:110)
at com.company.process.core.Manager$BrokerListener.readITMsg(Manager.java:74)
at com.company.core.util5.FixedSizeThreadPoolMsgBus$ParallelTask.run(FixedSizeThreadPoolMsgBus.java:37)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.company.server.TestImplConcrete
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
... 12 more
Caused by: java.io.NotSerializableException: com.company.server.TestImplConcrete
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at com.company.server.TopicSessionImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
... 1 more
Я просмотрел некоторые посты, и они предлагают, чтобы класс TestImplConcrete должен был стать сериализуемым, чтобы избежать этого исключения. Я полностью согласен с тем, что класс TestImplConcrete НЕ сериализуется. Но здесь возникает вопрос: если это единственное, что решает проблему, как класс чувствовал себя в течение последних 5 лет и как класс продолжает работать без каких-либо проблем?
Примечание: мы только что получили эту проблему только один раз, а затем, после перезапуска процесса, все работает нормально. Также обратите внимание, что вопрос не связан с моим кодом, он больше связан с сериализацией и RMI.
Код здесь:
// The colling class
Class CallingClass {
Public void createSubscription (){
TopicImpl topicPublisher = null;
try {
TopicImpl sessionInter = (TopicImpl) Naming.lookup(url);
if (sessionInter != null) {
topicPublisher = sessionInter.createMap();
}
} catch (Exception e) {
Logger.error(e);
}
}
}
The colling interface
public interface TopicImpl extends Remote {
TestImpl createMap() throws RemoteException ;
}
// Concrete class for calling interface
public class TopicImplConcrete implements TopicImpl {
String name = "abc";
// this map is give some value during class initialization
private ConcurrentHashMap<String, TestImplConcrete> concHashMap = new ConcurrentHashMap<String, TestImplConcrete>();
public TopicPublisher createMap() {
TestImpl refOfHere = getMethodHere(name);
return refOfHere;
}
public TestImplConcrete getMethodHere(String name) {
if (name != null) {
TestImplConcrete ref = concHashMap.get(name);
if (ref != null)
return ref;
synchronized (this) {
ref = concHashMap.get(name);
if (ref != null)
return ref;
ref = new TestImplConcrete(name);
concHashMap.put(name, ref);
try {
if (!ref.isExported()) {
UnicastRemoteObject.exportObject(ref);
ref.setExported(true);
}
} catch (RemoteException e) {
log.error("Remote Exception", e);
}
}
return ref;
}
return null;
}
}
// The interface being sent over..
public interface TestImpl extends Remote {
public TestImpl getMethod1() throws RemoteException;
public void method2() throws RemoteException;
}
// concrete class for the interface being sent over.
public class TestImplConcrete implements TestImpl {
private boolean isExportedBoolean;
public boolean isExported() {
return isExportedBoolean;
}
public void setExported(boolean isExportedBoolean) {
this.isExportedBoolean = isExportedBoolean;
}
public TestImpl getMethod1() {
// do something
}
public void method2() {
// do something
}
}
Обратите внимание: код был отредактирован для предоставления только соответствующей информации. Пожалуйста, дайте мне знать, если требуется дополнительная информация. Тот же код, вставленный выше, отлично работал уже несколько лет. Но в этот раз он показал исключение NotSerializableException.
1 ответ
testImpl
не должен быть Serializable, но если это не так, его нужно экспортировать во время его передачи или возврата через RMI.