gpt4 book ai didi

java - 如何在 onNext 调用中从上下文/范围中获取变量? (java/grpc)

转载 作者:行者123 更新时间:2023-11-30 06:05:08 25 4
gpt4 key购买 nike

我正在与 contexts 合作grpc/java内.

我最终会尝试

1) 从每个传入请求中获取作为 header 附加的元数据(凭据元数据)

2)将其附加到 grpc 范围/上下文,以便当请求传入服务器端时我可以访问它。

这是一种解决办法,因为我无法按照我的意愿更改 API。尽管如此,我还是定义了一个拦截器,它将剥离每个传入请求的元数据。

public class OnBehalfOfInterceptor implements ServerInterceptor {

@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
final ServerCall<ReqT, RespT> call,
final Metadata headers,
final ServerCallHandler<ReqT, RespT> next
) {

Context ctx = Context.current();

String mayDelegate = headers.get(
Metadata.Key.of("may-delegate", Metadata.ASCII_STRING_MARSHALLER)
);
String onBehalfOf;

if (mayDelegate != null && str2bool(mayDelegate)) {
onBehalfOf = headers.get(
Metadata.Key.of("on-behalf-of", Metadata.ASCII_STRING_MARSHALLER)
);
ctx = ctx.withValue(
Context.key("on-behalf-of"),
onBehalfOf
);
}

return Contexts.interceptCall(ctx, call, headers, next);
}

}

此代码尝试“代表”查找字符串,如果找到,则将其附加到当前上下文。

现在,当我去调试当前上下文时,我可以看到以下输出

Context.current().keyValueEntries.root.values[1]

result
key "on-behalf-of"
value "my id"

这是 .onNext() 调用内的调试输出,我能够看到上下文变量,正如我认为应该能够看到的那样。但是,当我不在调试运行时环境中时,我无法获取“keyValueEntries”。我猜测它是调试器提供的东西,不一定是 Context 类的成员。

那么...我如何正确访问附加到当前上下文的变量?我尝试了几个不同的示例并通过它们进行了调试。

Context.current().get(Context.key("on-behalf-of"))

// this ^ returns null

我只是想错了吗?有没有更简单的方法来从传入请求中获取元数据?

最佳答案

Context.Key 使用引用相等。您应该在两个位置使用相同的 Key 实例。传递的字符串只是一个调试字符串。正如 the documentation 中所写:

Create a Context.Key with the given debug name. Multiple different keys may have the same name; the name is intended for debugging purposes and does not impact behavior.

使用引用相等意味着您可以使用 Java 可见性限制来限制哪些代码可以访问上下文状态,这与 ThreadLocal 的使用方式相同。

关于java - 如何在 onNext 调用中从上下文/范围中获取变量? (java/grpc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51502295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com