拦截服务器消息,如何在gRPC服务器中添加全局异常拦截器?

public class GrpcExceptionHandler implements ServerInterceptor {

private final Logger logger = LoggerFactory.getLogger (GrpcExceptionHandler.class);

@Override

public ServerCall.Listener interceptCall (ServerCall call,

Metadata headers,

ServerCallHandler next) {

logger.info ("GRPC call at: {}", Instant.now());

ServerCall.Listener listener;

try {

listener = next.startCall (call, headers);

} catch (Throwable ex) {

logger.error ("Uncaught exception from grpc service");

call.close (Status.INTERNAL

.withCause (ex)

.withDescription ("Uncaught exception from grpc service"), null);

return new ServerCall.Listener() {};

}

return listener;

}

}

样品上面的拦截。

你需要引导它,当然,在期待任何东西之前;

serverBuilder.addService (ServerInterceptors.intercept (bindableService, interceptor));

UPDATE

public interface ServerCallHandler {

/**

* Produce a non-{@code null} listener for the incoming call. Implementations are free to call

* methods on {@code call} before this method has returned.

*

*

If the implementation throws an exception, {@code call} will be closed with an error.

* Implementations must not throw an exception if they started processing that may use {@code

* call} on another thread.

*

* @param call object for responding to the remote client.

* @return listener for processing incoming request messages for {@code call}

*/

ServerCall.Listener startCall(

ServerCall call,

Metadata headers);

}

可悲的是,不同的线程上下文意味着没有异常处理的范围,所以我的答案是不是你正在寻找解决方案..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gRPC拦截器实现gRPC请求的内部转发,可以使用gRPC提供的Stub对象来发送gRPC请求。首先,需要在代码注入Stub对象,代码如下: ```java @Autowired private XxxServiceGrpc.XxxServiceBlockingStub xxxServiceBlockingStub; ``` 然后,在拦截器使用Stub对象来发送gRPC请求,代码如下: ```java public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<RespT, ReqT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) { // 获取请求的方法名称和参数 String methodName = call.getMethodDescriptor().getFullMethodName(); ReqT request = call.getMessage(); // 构造请求的上下文 Context.CancellableContext withCancellation = Context.current().withCancellation(); withCancellation.attach(); // 发送gRPC请求并获取响应结果 RespT response = xxxServiceBlockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).withInterceptors(new HeaderClientInterceptor(headers)).execute(request); // 返回gRPC响应结果给调用方 return new ServerCall.Listener<ReqT>() {}; } ``` 在这段代码,我们使用Stub对象向目标gRPC服务发送gRPC请求,并将请求头和参数传递过去。然后,我们将目标gRPC服务的响应结果返回给调用方。 需要注意的是,在发送gRPC请求时,我们可以使用`withDeadlineAfter()`方法设置请求的超时时间,以避免请求一直阻塞。另外,我们还可以使用`withInterceptors()`方法设置请求的拦截器,以添加自定义的请求头等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值