簡體   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