Мы используем Kryonet для вызова методов сервера через RMI. Если служба возвращает нормальное значение (например, true/false), она работает нормально.
Но когда служба выдает исключение, мы получаем бесконечный цикл, приводящий к StackOverflowError на сервере.
Exception in thread "Server" java.lang.StackOverflowError
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:472)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:97)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:517)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:76)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
Обслуживание:
public class AuthServiceImpl extends BaseServiceImpl implements AuthService {
public boolean checkLogin(String username, String password) throws Exception {
// ...
throw new Exception("Test");
}
}
Звонок клиенту:
Boolean state = null;
try {
state = service.checkLogin("Test", "password");
} catch (Exception e) {
// Login Faild
// ...
}
return state;
Все классы зарегистрированы в крио.
- обслуживание
- Исключения
- Типы
Разве Kryonet не может обрабатывать исключения по RMI?
throws Exception
не очень изобретателен. Вы должны определить специальныйLoginException
или что-то еще, что будет выброшено этим интерфейсом, и выбросить его. - person user207421   schedule 01.02.2016