我們正在使用Java GRPC作爲我們的內部服務之一,並且我們有一個服務器端攔截器,用於從頭文件中獲取信息並在日誌記錄環境中設置它們在內部使用ThreadLocal。GRPC Java將數據從服務器攔截器傳遞到rpc服務調用
因此,在我們的攔截器,我們做同樣的事情到這一點:
LogMessageBuilder.setServiceName("some-service");
final String someHeaderWeWant = headers.get(HEADER_KEY);
final LoggerContext.Builder loggingContextBuilder = new LoggerContext.Builder()
.someFieldFromHeaders(someHeaderWeWant);
LoggerContext.setContext(loggingContextBuilder.build());
在我們的服務電話
然後我們進入這樣的:
LoggingContext loggingContext = LoggingContext.getCurrent()
但是目前情況下是空的某些時間。
然後,我們試圖用GRPC Context類象下面這樣:
LogMessageBuilder.setServiceName("some-service");
final String someHeaderWeWant = headers.get(HEADER_KEY);
final LoggerContext.Builder loggingContextBuilder = new LoggerContext.Builder()
.someFieldFromHeaders(someHeaderWeWant);
Context.current().withValue(LOGGING_CONTEXT_KEY, loggingContextBuilder.build()).attach()
然後訪問它像服務電話:
LoggingContext context = LOGGING_CONTEXT_KEY.get(Context.current())
然而,這也是有時空,如果我打印出來內存地址看起來早在上下文始終是ROOT上下文,無論我是否在攔截器中附加,但經過幾次調用後上下文都是正確的,並且記錄器數據就像它應該那樣。
因此,如果任何人有任何想法或更好的方式來傳播數據從攔截器到服務調用,我很樂意聽到它。
我過去幾天生病了,無法及時對IRC做出反應。我很高興它在這裏轉貼,以便我可以回答。 –