Quarkus gRPC 构建问题

Posted

技术标签:

【中文标题】Quarkus gRPC 构建问题【英文标题】:Quarkus gRPC build issue 【发布时间】:2021-11-24 23:42:11 【问题描述】:

关注这篇关于在 quarkus 中消费 gRPC 服务的博客https://quarkus.io/guides/grpc-service-consumption

通过运行 'mvn compile' 从 api 提供者提供的 proto 文件成功生成代码。

但在尝试构建应用时出现错误

“只有 Mutiny 服务接口、阻塞存根、基于 Mutiny 和 io.grpc.Channel 的反应存根可以通过@GrpcClient 注入”

./mvnw clean package -Dmaven.test.skip

...
[error]: Build step io.quarkus.grpc.deployment.GrpcClientProcessor#discoverInjectedGrpcServices threw an exception: javax.enterprise.inject.spi.DeploymentException: ...ServiceGrpc cannot be injected into ...ServiceGrpc - only Mutiny service interfaces, blocking stubs, reactive stubs based on Mutiny and io.grpc.Channel can be injected via @GrpcClient

[ERROR]         at io.quarkus.grpc.deployment.GrpcClientProcessor.invalidInjectionPoint(GrpcClientProcessor.java:282)
[ERROR]         at io.quarkus.grpc.deployment.GrpcClientProcessor.discoverInjectedGrpcServices(GrpcClientProcessor.java:170)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
[ERROR]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.base/java.lang.reflect.Method.invoke(Method.java:568)
[ERROR]         at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:820)
[ERROR]         at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
[ERROR]         at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
[ERROR]         at java.base/java.lang.Thread.run(Thread.java:833)
[ERROR]         at org.jboss.threads.JBossThread.run(JBossThread.java:501)

【问题讨论】:

你已经编辑了错误信息,所以我不能参考类名,但是你能把第一个...GrpcService源代码的相关部分显示出来吗? 实际上我能够构建应用程序。请参阅下面代码中有关问题原因的评论。但我还没有功能齐全的 bean,请参阅代码中的 cmets 并帮助我找出错误。 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

通过更改注入修复了构建问题,请参阅下面的代码。但仍无法使其完全正常工作,请参阅 cmets 中的详细信息:

public class SendMsgService 
    //THIS INJECTION WAS CAUSING THE  ISSUE WITH THE BUILD
    // @GrpcClient("msg-service")
    // ServiceGrpc.ServiceStub stubInjected;

    @GrpcClient("msg-service")
    MutinyServiceGrpc.MutinyServiceStub stubInjected;

    MutinyServiceGrpc.MutinyServiceStub stubPojo = MutinyServiceGrpc.newMutinyStub(Utils.getChannelUrlStr()); 

    @GET
    @Path("/send-message/message")
    public void send(@PathParam("message") String message) 
        var msg = Utils.buildMessage(message);
        BearerToken token = new BearerToken(ApiCredentials.getClientCredentialSource()::accessToken);

        //THIS IS WORKING
        stubPojo.withCallCredentials(token).sendTextToSubscriberAsOperator(msg).subscribe().with(item -> System.out.println(item),failure -> System.out.println("Failed with " + failure));

        //THIS IS NOT WORKING
        //stubInjected.withCallCredentials(token).sendTextToSubscriberAsOperator(msg).subscribe().with(item -> System.out.println(item),failure -> System.out.println("Failed with " + failure));

        System.out.println("Msg has been sent");
    

application.properties 也有 var quarkus.grpc.clients.msg-service.host,其值与 Utils.getChannelUrlStr() 相同。

【讨论】:

你的*.proto文件是什么?

以上是关于Quarkus gRPC 构建问题的主要内容,如果未能解决你的问题,请参考以下文章

Quarkus GRPC 服务器无法启动

Quarkus 阻塞 grpc vert.x 事件循环错误

Quarkus 项目在 Bamboo 中构建失败

如何在 google cloudbuild 上构建 quarkus 原生镜像

云原生时代高性能Java框架—Quarkus

云原生时代高性能Java框架—Quarkus