【问题标题】:Propagating errors between Hazelcast Server and Hazelcast Client在 Hazelcast 服务器和 Hazelcast 客户端之间传播错误
【发布时间】:2019-11-11 09:17:53
【问题描述】:

我有以下情况: - Hazelcast 服务器作为微服务,在收到方法调用时执行一些计算。 - Hazelcast Client 作为另一个微服务,通过指定的方法调用调用 Hazelcast Server。

我希望当我从 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 的类,它有一个方法 public void register(int errorCode, Class clazz) 但我找不到接收 ClientExceptions 实例的方法(我应该提到我正在使用 Hazelcast Spring)。

谢谢!

【问题讨论】:

    标签: spring spring-boot hazelcast


    【解决方案1】:

    自 3.12.x 起,不支持将自定义异常工厂注册为 API。 相关问题关注https://github.com/hazelcast/hazelcast/issues/9753 作为一种解决方法,我可以建议使用类名 (UndefinedErrorCodeException.getOriginialClassName()) 在客户端重新创建异常类。

    == 编辑 ==

    客户端 API 不支持。您已找到私有 API。 如果您可以依赖私有 API,这里是在 hazelcast 服务器上注册类的 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);
    }
    

    【讨论】:

    • 我已经在 github 上发现了这个问题。我也知道解决方法,但如果 Hazelcast 客户端 API 允许注册自定义异常,我认为在服务器端也应该可以。
    • 我已经使用依赖私有 API 的服务器端注册编辑了我的原始答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多