在 Hazelcast 服务器和 Hazelcast 客户端之间传播错误
Propagating errors between Hazelcast Server and Hazelcast Client
我有以下场景:
- 作为微服务的 Hazelcast 服务器,它在接收到方法调用时执行一些计算。
- 作为另一个微服务的 Hazelcast 客户端,它通过指定的方法调用调用 Hazelcast 服务器。
我希望当我从 Hazelcast 服务器抛出异常时在 Hazelcast 客户端接收它(目前,我正在接收这样的东西:java.util.concurrent.ExecutionException: com.hazelcast.client.UndefinedErrorCodeException: Class name: ro.orange.eshop.personalisationengineapi.application.exception.ValidationException
)
我深入研究了 API,在 Hazelcast 客户端,我找到了注册新异常的方法:
@Bean
fun addHazelcastKnownExceptions(hazelcastInstance: HazelcastInstance): Int {
val hazelcastClientInstance = (hazelcastInstance as HazelcastClientProxy).client
hazelcastClientInstance.clientExceptionFactory.register(400, ValidationException::class.java) { message, cause -> ValidationException(message, cause) }
return 1
}
但似乎也必须在服务器端注册此异常。 问题来了! 在服务器端,我找到了一个名为 ClientExceptions
的 class,它有一个方法 public void register(int errorCode, Class clazz)
但我不能'找不到接收 ClientExceptions
实例的方法(我应该提到我正在使用 Hazelcast Spring)。
谢谢!
从 3.12.x 开始,不支持将自定义异常工厂注册为 API。
要关注的相关问题 https://github.com/hazelcast/hazelcast/issues/9753
作为解决方法,我建议使用 class 名称 (UndefinedErrorCodeException.getOriginialClassName()) 在客户端重新创建异常 classes。
== 编辑 ==
客户端API不支持。您找到了私有 API。
如果您可以依赖私有 API,这里是在 hazelcast 服务器上注册 classes 的 hack:
请注意,我不推荐此解决方案,因为它依赖于可以更改的私有 API。
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
if (instance instanceof HazelcastInstanceProxy) {
HazelcastInstanceImpl original = ((HazelcastInstanceProxy) instance).getOriginal();
ClientExceptions clientExceptions = original.node.getClientEngine().getClientExceptions();
clientExceptions.register( USER_EXCEPTIONS_RANGE_START + 1, UndefinedCustomFormatException.class);
}
我有以下场景: - 作为微服务的 Hazelcast 服务器,它在接收到方法调用时执行一些计算。 - 作为另一个微服务的 Hazelcast 客户端,它通过指定的方法调用调用 Hazelcast 服务器。
我希望当我从 Hazelcast 服务器抛出异常时在 Hazelcast 客户端接收它(目前,我正在接收这样的东西:java.util.concurrent.ExecutionException: com.hazelcast.client.UndefinedErrorCodeException: Class name: ro.orange.eshop.personalisationengineapi.application.exception.ValidationException
)
我深入研究了 API,在 Hazelcast 客户端,我找到了注册新异常的方法:
@Bean
fun addHazelcastKnownExceptions(hazelcastInstance: HazelcastInstance): Int {
val hazelcastClientInstance = (hazelcastInstance as HazelcastClientProxy).client
hazelcastClientInstance.clientExceptionFactory.register(400, ValidationException::class.java) { message, cause -> ValidationException(message, cause) }
return 1
}
但似乎也必须在服务器端注册此异常。 问题来了! 在服务器端,我找到了一个名为 ClientExceptions
的 class,它有一个方法 public void register(int errorCode, Class clazz)
但我不能'找不到接收 ClientExceptions
实例的方法(我应该提到我正在使用 Hazelcast Spring)。
谢谢!
从 3.12.x 开始,不支持将自定义异常工厂注册为 API。 要关注的相关问题 https://github.com/hazelcast/hazelcast/issues/9753 作为解决方法,我建议使用 class 名称 (UndefinedErrorCodeException.getOriginialClassName()) 在客户端重新创建异常 classes。
== 编辑 ==
客户端API不支持。您找到了私有 API。 如果您可以依赖私有 API,这里是在 hazelcast 服务器上注册 classes 的 hack: 请注意,我不推荐此解决方案,因为它依赖于可以更改的私有 API。
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
if (instance instanceof HazelcastInstanceProxy) {
HazelcastInstanceImpl original = ((HazelcastInstanceProxy) instance).getOriginal();
ClientExceptions clientExceptions = original.node.getClientEngine().getClientExceptions();
clientExceptions.register( USER_EXCEPTIONS_RANGE_START + 1, UndefinedCustomFormatException.class);
}