web-dev-qa-db-fra.com

Channel ManagedChannelImMImLIML n'a pas été fermé correctement

Si je cours après ces deux tests, je reçois l'erreur.

1ère test

@Rule
public GrpcCleanupRule grpcCleanup = new GrpcCleanupRule();

@Test
public void findAll() throws Exception {
    // Generate a unique in-process server name.
    String serverName = InProcessServerBuilder.generateName();

    // Create a server, add service, start, and register for automatic graceful shutdown.
    grpcCleanup.register(InProcessServerBuilder
            .forName(serverName)
            .directExecutor()
            .addService(new Data(mockMongoDatabase))
            .build()
            .start());

    // Create a client channel and register for automatic graceful shutdown.
    RoleServiceGrpc.RoleServiceBlockingStub stub = RoleServiceGrpc.newBlockingStub(
            grpcCleanup.register(InProcessChannelBuilder
                    .forName(serverName)
                    .directExecutor()
                    .build()));

    RoleOuter.Response response = stub.findAll(Empty.getDefaultInstance());
    assertNotNull(response);
}

2ème test

@Test
public void testFindAll() {
    ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8081)
            .usePlaintext()
            .build();

    RoleServiceGrpc.RoleServiceBlockingStub stub = RoleServiceGrpc.newBlockingStub(channel);
    RoleOuter.Response response = stub.findAll(Empty.newBuilder().build());
    assertNotNull(response);
}

iO.GRPC.Internal.ManagedChanneLorPhanWanWrapper $ GESTIONDChanneLelEference CleanQueUeUe Sévère: ~ ~ ~ Channel ManagedChannelimll {logid = 1, cible = localhost: 8081} n'a pas été arrêté correctement !!! ~ ~ ~ Assurez-vous d'appeler l'arrêt ()/shutdownow () et attendez jusqu'à ce que l'éveil () renvoie true.

Java.lang.runtimeException: site d'allocation dehannel géant sur io.grpc.internal.managedChannelorphanWrapper $ GestiondChannelReference. (ManageDhannelorPhanWrapper.java:94)

Si je commentaire l'un d'entre eux, aucune erreur, aucune erreur, les tests unitaires ne sont que, mais l'exception est lancée si les deux sont courus ensemble.

éditer

Basé sur la suggestion.

@Test
public void testFindAll() {
    ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8081)
            .usePlaintext()
            .build();

    RoleServiceGrpc.RoleServiceBlockingStub stub = RoleServiceGrpc.newBlockingStub(channel);
    RoleOuter.Response response = stub.findAll(Empty.newBuilder().build());
    assertNotNull(response);

    channel.shutdown();
}
6
AppDeveloper

Hey je viens de faire face à un numéro similaire à l'aide de dialoglfow v2 Java SDK où j'ai reçu l'erreur

 Oct 19, 2019 4:12:23 PM io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference cleanQueue
SEVERE: *~*~*~ Channel ManagedChannelImpl{logId=41, target=dialogflow.googleapis.com:443} was not shutdown properly!!! ~*~*~*
    Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.

En outre, avoir une énorme base client, nous avons commencé à courir dans out of memory unable to create native thread Erreur.

Après avoir effectué de nombreuses opérations de débogage et utiliser Visual VM Surveillance de thread, j'ai enfin compris que le problème était à cause de SessionsClient non de fermeture. Donc, j'ai utilisé le bloc de code ci-joint pour résoudre Ce problème. Post Test qui bloque que je pouvais enfin libérer tous les threads usagés et que l'erreur mentionnée précédemment a été résolue.

SessionsClient sessionsClient = null;
QueryResult queryResult = null;

try {
    SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
    SessionsSettings sessionsSettings = settingsBuilder
            .setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
    sessionsClient = SessionsClient.create(sessionsSettings);
    SessionName session = SessionName.of(projectId, senderId);
    com.google.cloud.dialogflow.v2.TextInput.Builder textInput = TextInput.newBuilder().setText(message)
            .setLanguageCode(languageCode);
    QueryInput queryInput = QueryInput.newBuilder().setText(textInput).build();

    DetectIntentResponse response = sessionsClient.detectIntent(session, queryInput);

    queryResult = response.getQueryResult();
} catch (Exception e) {
    e.printStackTrace();
}
finally {
    sessionsClient.close();
}

Les valeurs plus courtes du graphique mettent en évidence l'utilisation du client.Close (). Sans que les fils étaient bloqués dans l'état de stationnement.

2
Ayyub Kolsawala