本文介紹了GRPC-使用ContextPropagatingExecutorService和CurentConextExecutor的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
由于GRPC在新線程上進行服務調用,并且GRPC上下文是線程本地的,我如何傳播此GRPC上下文?我發現可以使用Conext.currentContextExecutor()和ConextPropagatingExecutorService,但我沒有找到足夠的資源或示例來支持這兩個選項。有人能幫助實施這些嗎?
推薦答案
客戶端偵聽器不應更改應用程序看到的上下文實例。無論是使用阻塞、異步還是將來的存根,以及阻塞API將無法更改當前上下文,上下文行為都不應真正更改。
雖然攔截器可以自由地修改上下文中預先存在的(可變)值,但通常不需要這樣做。通常,在每個RPC中創建一個新的攔截器實例并直接與攔截器通信,或通過自定義的CallOption進行通信更容易。
如果您只有一個需要訪問響應頭的調用站點,那么MetadataUtils.newCaptureMetadataInterceptor()
是獲取元數據的一種方便(盡管迂回)的方法。它是為測試而設計的,但適用于測試情況之外的小規模使用。
AtomicReference<Metadata> headers = new AtomicReference<>();
AtomicReference<Metadata> trailers = new AtomicReference<>();
// Using blocking for simplicity, but applies equally to futures
stub.withInterceptors(MetadataUtils.newCaptureMetadataInterceptor(headers, trailers))
.someRpc();
Metadata headersSeen = headers.get();
如果需要從多個調用點訪問相同的標頭,最好創建一個執行所需操作的自定義偵聽器。
CustomInterceptor interceptor = new CustomInterceptor();
stub.withInterceptors(interceptor)
.someRpc();
... = interceptor.getWhateverValue();
這是在演示一個通用用例。特定實例通常可以進一步調整接口,使其更方便、更自然。
這篇關于GRPC-使用ContextPropagatingExecutorService和CurentConextExecutor的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,