_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);
    }
Вернуться на верх