Я пытаюсь написать RPC
с Thrift
, клиент, кажется, прекрасно общается с сервером, и сервер создает список для возврата к клиенту (правильный формат). Но тогда клиент каким-то образом не может распознать пакет, когда я получаю эту ошибку:
org.apache.thrift.TApplicationException: getEntityByIP не удалось: неизвестный результат
Это то, что выглядит мой бережливый файл:
struct EntityLookupMessage{
1: list<i32> entityIDs;
}
service EntityJoinService {
list<i32> getEntityByIP(1:string IPval,2:i32 date);
}
И ServerImpl - это следующий метод:
public List<Integer> getEntityByIP(String IPval, int date) throws TException {
try{
System.out.println("Checking..."+IPval);
List<Integer> response=EntityJoinStandalone.getEntityByIP(entityLookup,IPval, date);
System.out.println(response);
return response;
}finally{
// TODO Auto-generated method stub
return null
}
Вызывается клиентом следующим образом:
List<Integer> entity = client.getEntityByIP(IPval, date);
Есть идеи, почему это так?
Конструкция не позволяет получить нулевые результаты. Это код сгенерированной функции recv_Xxx():
public List<Integer> recv_getEntityByIP() throws org.apache.thrift.TException
{
getEntityByIP_result result = new getEntityByIP_result();
receiveBase(result, "getEntityByIP");
if (result.isSetSuccess()) {
return result.success;
}
throw new org.apache.thrift.TApplicationException(
org.apache.thrift.TApplicationException.MISSING_RESULT,
"getEntityByIP failed: unknown result");
}
Вы должны вернуть действительный результат, который...
null
Удалите return null
из предложения finally
.
Поместите результат в объект, аналогичный тому, что вы уже делали с аргументами:
struct EntityByIP_result {
1: list<i32> data;
}
Таким образом, вы также оставляете место для дальнейшего улучшения в будущем, вы можете добавлять новые поля в struct
в любое время.