_MultiThreadedRendezvous с debug_error_string = "None"
Заявление о проблеме
Я реализую службу связи gRPC между Java-приложением (spring-boot в качестве бэкенд-сервиса) и Python-приложением (Django в качестве промежуточного ПО). Огромный объем данных доступен в базе данных Mongo и подключен к приложению spring, из которого я хочу получать данные и выполнять операции CRUD, используя фреймворк gRPC, поэтому приложение spring работает как поставщик услуг в обратных вызовах gRPC. На стороне клиента фреймворка gRPC, т.е. на выходе Django, мне нужно, чтобы данные были доступны в формате JSON, чтобы их можно было передать другому фронтенд-приложению, где пользователь может взаимодействовать с приборной панелью.
Сообщение об ошибке
После запуска приложения Django вот сообщение об ошибке, отображаемое при вызове метода.
Request Method: GET
Request URL: http://127.0.0.1:8000/api/info/
Django Version: 4.1
Exception Type: _MultiThreadedRendezvous
Exception Value:
<_MultiThreadedRendezvous of RPC that terminated with:
status = StatusCode.INTERNAL
details = "Exception deserializing response!"
debug_error_string = "None"
>
Exception Location: /Users/Bhavesh/Codebase/gsoc-smiles/grpc_listener/venv/lib/python3.9/site-packages/grpc/_channel.py, line 826, in _next
Raised during: client.views.client
Python Executable: /Users/Bhavesh/Codebase/gsoc-smiles/grpc_listener/venv/bin/python
Python Version: 3.9.12
Python Path:
['/Users/Bhavesh/Codebase/gsoc-smiles/grpc_listener',
'/opt/anaconda3/lib/python39.zip',
'/opt/anaconda3/lib/python3.9',
'/opt/anaconda3/lib/python3.9/lib-dynload',
'/Users/Bhavesh/Codebase/gsoc-smiles/grpc_listener/venv/lib/python3.9/site-packages']
Server time: Sun, 28 Aug 2022 23:45:40 +0000
gRPC protobuf
syntax = "proto3";
package calcInfo;
message CalcInfo{
string calcinfo_id = 1;
string smiles = 2;
int64 nbasis = 3;
int64 nmo = 4;
int64 nalpha = 5;
int64 nbeta = 6;
int64 natom = 7;
double energy = 8;
}
message ListInfoRequest {}
message ListInfoResponse {
CalcInfo calcInfo = 1;
}
service CalcInfoService {
rpc ListCalcInfo (ListInfoRequest) returns (stream CalcInfo) {};
}
Реализация клиента gRPC (Django).
Приведенный ниже код относится к реализации операции LIST ALL в файле view.py.
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse, JsonResponse
import time
import grpc
import json
import calc_info_pb2, calc_info_pb2_grpc
def listCalcInfo(channel):
stub = calc_info_pb2_grpc.CalcInfoServiceStub(channel)
for info_list in stub.ListCalcInfo(calc_info_pb2.ListInfoRequest()):
data = {'calcinof_id':info_list.calcinfo_id,
'smiles':info_list.smiles,
'nbasis':info_list.nbasis,
'nmo':info_list.nmo,
'nalpha':info_list.nalpha,
'nbeta':info_list.nbeta,
'natom':info_list.natom,
'energy':info_list.energy}
return json.dumps(data)
@csrf_exempt
def client(request):
if request.method == 'GET':
print(request)
with grpc.insecure_channel('localhost:50051') as channel:
return JsonResponse(listCalcInfo(channel), safe=False)
# return JsonResponse(json.dumps(data), safe=False)
Реализация сервера gRPC (Spring boot)
@Override
public void listCalcInfo(ListInfoRequest request, StreamObserver<ListInfoResponse> responseObserver) {
System.out.println(" \n\n ----------- LIST OPERATION ---------- ");
System.out.println("Received a request to LIST the Info data.");
// Searching for the data from mongo collection (iteration: document by document)
mongoCollection.find().iterator().forEachRemaining(document -> responseObserver.onNext(
ListInfoResponse.newBuilder()
.setCalcInfo(documentToCalcInfo(document)).build()
));
System.out.println("Successfully displayed the Info Data from Mongo Collection");
System.out.println("----------------------------------------");
super.listCalcInfo(request, responseObserver);
}