如何将 Java 异常从 arrow flight 服务器传递给客户端? (都使用 Java 库)

How to pass Java exceptions from arrow flight server to client? (both using Java libraries)

在接受数据流的 acceptPut 调用中,我想在 arrow flight 服务器端抛出一个异常,它应该可供 arrow flight 客户端使用,以便客户端可以为客户端的消费者重新抛出它以获得实际异常. 请建议是否有任何标准方法将异常详细信息从 arrow flight 服务器传递到客户端?

我想做的是使用以下代码: 如果“ex”是我的自定义异常则:

    String customException = objMapper.writeValueAsString(ex);
    ErrorFlightMetadata metadata = new ErrorFlightMetadata();
    metadata.insert("value", customException);
    ackStream.onError(new CallStatus(FlightStatusCode.INTERNAL, ex,
        "CustomException", metadata).toRuntimeException());

但是在箭头飞行客户端,当我运行:

stream.getResult();

它抛出 FlightRuntimeException 异常,状态代码和描述正确,正如我在服务器端设置的那样,但 ErrorFlightMetadata 对象不存在。

如果 ErrorFlightMetadata 没有从服务器传递到客户端,那么将异常详细信息从服务器发送到客户端的替代选项是什么。

在这方面,Arrow Flight 反映了 gRPC Java。虽然 CallStatus 允许您附加异常,但这不会镜像到客户端以避免将有关服务器的详细信息泄露给客户端。

最简单的方法是将异常字符串化并将其包含在错误消息中。只要回溯不太长(几千字节),就可以正常工作。 (gRPC,底层传输,默认限制元数据的大小,元数据用于携带错误信息。)

您还可以将自定义键值元数据附加到错误。

目前(Arrow 4.0.0),这还没有完全实现:见ARROW-12842. (This was fixed for 5.0.0.) So for now, you must use gRPC's StatusRuntimeException directly, e.g. see this test case: TestErrorMetadata.java

将来,您还可以将元数据附加到航班错误对象: https://arrow.apache.org/docs/java/reference/org/apache/arrow/flight/CallStatus.html#withMetadata-org.apache.arrow.flight.ErrorFlightMetadata-

无论哪种情况,请注意客户端可能默认显示也可能不显示此信息。如果您想以编程方式在客户端获取回溯并对其进行处理,这会更有用。