apache/dolphinscheduler · error · GrpcParserException

cannot find method <rpcName> from service <serviceName> with

Error message

cannot find method <rpcName> from service <serviceName> with method list: [methods]

What it means

After the service descriptor is found, call() looks up the RPC method on it with findMethodByName(). If the rpc part of 'Service.rpc' does not match any method declared in that service, GrpcParserException is thrown and the message helpfully includes the list of valid method names.

Source

Thrown at dolphinscheduler-task-plugin/dolphinscheduler-task-grpc/src/main/java/org/apache/dolphinscheduler/plugin/task/grpc/protobufjs/GrpcDynamicService.java:62

    Descriptors.FileDescriptor fileDescriptor;
    ManagedChannel channel;

    public GrpcDynamicService(ManagedChannel channel, Descriptors.FileDescriptor fileDesc) {
        this.fileDescriptor = fileDesc;
        this.channel = channel;
    }

    public DynamicMessage call(String methodNameWithService, String messageJSON, long timeout) {
        MethodName methodNameData = new MethodName(methodNameWithService);
        Descriptors.ServiceDescriptor pServiceDescriptor =
                fileDescriptor.findServiceByName(methodNameData.getServiceName());
        if (isNull(pServiceDescriptor))
            throw new GrpcParserException(
                    "cannot find service <" + methodNameData.getServiceName() + "> from service definition");
        Descriptors.MethodDescriptor pMethodDescriptor =
                pServiceDescriptor.findMethodByName(methodNameData.getRpcName());
        if (isNull(pMethodDescriptor))
            throw new GrpcParserException("cannot find method <" + methodNameData.getRpcName() + "> from service <"
                    + methodNameData.getServiceName() + "> with method list: " + Arrays.toString(pServiceDescriptor
                            .getMethods().stream().map(Descriptors.MethodDescriptor::getName).toArray()));
        MethodDescriptor<DynamicMessage, DynamicMessage> methodDescriptor =
                methodFromProtobuf(pServiceDescriptor, pMethodDescriptor);
        Descriptors.Descriptor requestMessageType = pMethodDescriptor.getInputType();
        Descriptors.Descriptor responseMessageType = pMethodDescriptor.getOutputType();
        DynamicMessage.Builder requestBuilder = DynamicMessage.newBuilder(requestMessageType);
        DynamicMessage.Builder responseBuilder = DynamicMessage.newBuilder(responseMessageType);
        try {
            JsonFormat.parser().ignoringUnknownFields().merge(messageJSON, requestBuilder);
        } catch (InvalidProtocolBufferException ipbe) {
            throw new GrpcParserException(
                    "cannot merge json message to protobuf definition type <" + requestMessageType.getName() + ">",
                    ipbe);
        }
        DynamicMessage request = requestBuilder.build();
        CallOptions callOptions = timeout > 0 ? CallOptions.DEFAULT.withDeadlineAfter(timeout, TimeUnit.MILLISECONDS)
                : CallOptions.DEFAULT;

View on GitHub (pinned to 02eac45a1b)

Solutions

  1. Read the method list printed in the exception message and use one of those exact names.
  2. Fix the rpc name spelling/casing in the methodNameWithService string to match the 'rpc X (...)' declaration in the .proto.
  3. Confirm the rpc belongs to the service you specified — you may have the right method on a different service.
  4. If the rpc was renamed in a newer proto, update the task configuration accordingly.

Example fix

// before
grpcTask.call("UserService.getUsr", json, 3000);
// after
grpcTask.call("UserService.getUser", json, 3000);
Defensive patterns

Strategy: validation

Validate before calling

Descriptors.ServiceDescriptor svc = fileDescriptor.findServiceByName(serviceName);
if (svc != null && svc.findMethodByName(rpcName) == null) {
    throw new IllegalArgumentException("Unknown rpc " + rpcName + " in " + serviceName
        + "; available: " + Arrays.toString(svc.getMethods().stream()
            .map(Descriptors.MethodDescriptor::getName).toArray()));
}

Try / catch

try {
    dynamicService.call(methodNameWithService, json, timeout);
} catch (GrpcParserException e) {
    if (e.getMessage().contains("cannot find method")) {
        // parse the method list from the message and suggest the closest name
    }
    throw e;
}

Prevention

When it happens

Trigger: Calling GrpcDynamicService.call('ServiceName.rpcName', ...) where serviceName resolves but rpcName is misspelled, wrong case, or simply not an rpc defined inside that service.

Common situations: Calling the rpc name instead of the fully-qualified name convention expected (or vice versa); proto was regenerated and the rpc was renamed; copy-pasted method string from a different service; case mismatch (e.g. getuser vs GetUser).

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06). Data as JSON: /api/errors/51fc00226e46b21a. Report an issue: GitHub.