【问题标题】:Is it possible to run a gRPC server in a Java application using WildFly?是否可以使用 WildFly 在 Java 应用程序中运行 gRPC 服务器?
【发布时间】:2020-09-04 10:06:23
【问题描述】:

我正在尝试在 WildFly 应用程序中运行 gRPC 服务器,以使用 Quarkus 从客户端 Java 微服务连接。 我能够在端口 9002 上为 gRPC 设置一个正在运行的服务器,客户端微服务可以连接到该服务器。
当调用正在运行的 gRPC 服务时,我可以看到 rpc 函数在 WildFly 应用程序中执行。但是,我遇到了两个问题。 对于服务器和服务设置,我以this code 为例。

问题

  1. 依赖注入在此服务中不起作用。该 bean 是在 WildFly 中创建的,但无论我 @Inject 到 gRPC 服务中的什么对象,它总是有一个 null 值。
  2. 服务器执行代码并回复适当的 gRPC 消息,但此消息永远不会到达客户端。不会显示任何错误。

有没有人遇到过这些问题,或者知道是否可以在 WildFly 应用程序中运行 gRPC 服务器?

我尝试了什么:

我试图找到与 WildFly 的现有 gRPC 集成,但目前正在开发中,因为我可以从 this open pull request 获得。
this mailing list 看来,有人做了概念证明并对 WildFly 代码进行了更改以使其工作,但这不是我们正在寻找的解决方案,因为我们不想更改 WildFly 代码。

相关代码
客户端代码在blockingStub.updateBalance(request) 调用上挂起,因为没有收到任何回复:

BalanceUpdateGrpc.BalanceUpdateBlockingStub blockingStub = BalanceUpdateGrpc.newBlockingStub(channel);
var request = BalanceUpdateRequest.newBuilder()
    .setContractNumber("111")
    .setBalance((float) 100.2)
    .setDate(BalanceUpdateRequest.Date
            .newBuilder()
            .setDay(3)
            .setMonth(11)
            .setYear(2020)
            .build())
    .build();
var reply = blockingStub.updateBalance(request);

服务代码:

@Singleton
public class BalanceUpdateService extends BalanceUpdateGrpc.BalanceUpdateImplBase {
    @Inject
    private DossierDAO dossierDAO;


    @Override
    public void updateBalance(BalanceUpdateRequest balanceUpdateRequest, StreamObserver<BalanceUpdateReply> responseObserver) {
        //Just reply with true
        //dossierDAO is always null when used in this code block
        responseObserver.onNext(BalanceUpdateReply.newBuilder().setSuccess(true).build());
    }
}

【问题讨论】:

    标签: java wildfly grpc grpc-java


    【解决方案1】:

    我没有使用 WildFly 的经验,但这似乎是与应用程序上下文相关的经典问题。当您使用 NEW 而不是通过 IOC 获得对象时,就会发生这种情况。当你这样做时,注射不起作用。
    知道春天吗?春天有同样的概念。或许你可以把这个 Spring 代码转置为 WildFly

    public static void main(String[] args)throws IOException, InterruptedException {
            SpringApplication springApplication = new SpringApplication(App.class, GrpcConfig.class);
    
    
              //Getting application context with all objects created with annotations
                ConfigurableApplicationContext context = springApplication.run(args);
           // Getting object created by Spring "Wildfly" from outside the context
                GrpcServer grpcServer = context.getBean(GrpcServer.class);
                grpcServer.start();
            }
    

    这里有一个 gRPC 和 Spring 的例子可以帮助你。 https://github.com/apssouza22/modern-api-management/blob/master/services/shelf/src/main/java/com/apssouza/shelf/App.java

    对于这个问题,你只需要更好地了解你的框架是如何工作的

    【讨论】:

      【解决方案2】:

      我需要补充:

      responseObserver.onCompleted()
      

      到服务以获取发送回客户端的响应。 然而,null 注入仍然是一个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        相关资源
        最近更新 更多