是否可以使用wildfly在java应用程序中运行grpc服务器?

lmyy7pcs  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(472)

我正在尝试在我们的wildfly应用程序中运行grpc服务器,以便使用quarkus从客户机java微服务连接到。我能够在grpc的9002端口上设置一个运行中的服务器,客户端微服务可以连接到该服务器。
在调用正在运行的grpc服务时,我可以看到rpc函数在wildfly应用程序中执行。但是我遇到了两个问题。对于服务器和服务设置,我使用以下代码作为示例。
问题
依赖项注入在此服务中不起作用。bean是在wildfly中创建的,但是无论我@注入grpc服务的对象是什么,它总是有一个 null 价值观。
服务器执行代码并用适当的grpc消息答复,但此消息从未到达客户端。不会显示任何错误。
有没有人对这些问题有经验,或者知道是否有可能在wildfly应用程序中运行grpc服务器?
我尝试的是:
我试图找到一个现有的grpc与wildfly的集成,但这目前正在进行中,因为我可以从这个open pull请求派生。
从这个邮件列表来看,似乎有人做了一个概念证明,并对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());
    }
}
qoefvg9y

qoefvg9y1#

我需要补充:

responseObserver.onCompleted()

将响应发送回客户端。这个 null 然而,注射仍然是一个问题。

dz6r00yl

dz6r00yl2#

我没有使用wildfly的经验,但它似乎是与应用程序上下文相关的经典问题。当你得到一个新的而不是通过ioc的对象时,就会发生这种情况。当你这么做的时候,注射就不起作用了。
你知道Spring吗?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
对于这个问题,您只需要更好地了解您的框架是如何工作的

相关问题