是否可以使用WildFly在Java应用程序中运行gRPC服务器?

问题描述

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

问题

  1. 依赖项注入在此服务中不起作用。 Bean是在WildFly中创建的,但是无论我@inject到gRPC Service中的哪个对象,它始终具有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());
    }
}

解决方法

我没有WildFly的经验,但似乎是与应用程序上下文有关的经典问题。当您使用NEW而不是通过IOC获取对象时,就会发生这种情况。当您这样做时,注射将不起作用。
知道春天吗? Spring具有相同的概念。也许您可以将此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

对于这个问题,您只需要更好地了解框架的工作原理

,

我需要添加:

responseObserver.onCompleted()

到服务以将响应发送回客户端。 null注入仍然是一个问题。