繁体   English   中英

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

[英]Is it possible to run a gRPC server in a Java application using WildFly?

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

问题

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

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

我试过的:

我试图找到与 WildFly 的现有 gRPC 集成,但目前正在开发中,因为我可以从这个 open pull request 中获得
这个邮件列表看来,似乎有人进行了概念验证并对 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注入仍然是一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM