Распространение ошибок между Hazelcast Server и Hazelcast Client - PullRequest
1 голос
/ 11 ноября 2019

У меня есть следующий сценарий: - Hazelcast Server в качестве микросервиса, который выполняет некоторые вычисления при получении вызова метода. - Hazelcast Client как другой микросервис, который вызывает Hazelcast Server с помощью указанного вызова метода.

Я хочу, чтобы, когда я выбрасываю исключение с Hazelcast Server, он получал его на стороне Hazelcast Client как есть (в настоящее время,Я получаю что-то вроде этого: 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).

Спасибо!

1 Ответ

0 голосов
/ 11 ноября 2019

Не поддерживается регистрация фабрики пользовательских исключений в качестве API по состоянию на 3.12.x. Следующая проблема https://github.com/hazelcast/hazelcast/issues/9753 В качестве обходного пути я мог бы предложить использовать имя класса (UndefinedErrorCodeException.getOriginialClassName ()) для воссоздания классов исключений на стороне клиента.

== РЕДАКТИРОВАТЬ ==

Клиентский API не поддерживает его. Вы нашли приватный API. Если вы согласны с тем, чтобы полагаться на частный API, вот способ регистрации классов на сервере Hazelcast: обратите внимание, что я НЕ РЕКОМЕНДУЮ этого решения, поскольку оно опирается на частный 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);
}
...