Проблемы сериализации GridGain

Я создал систему обмена сообщениями, используя GridGain для реализации. У меня есть класс MessageCenter, состоящий из GridGain GridProjection, моя установка выглядит примерно так

Gateway-> MessageCenter-> GridProjection

Теперь, когда я запускаю шлюз, который, в свою очередь, запускает сетку, запуская другой шлюз, я получаю ошибки сериализации, потому что GridGain пытается сериализовать шлюз, MessageCenter и все их зависимости, что заставляет меня помечать все как сериализуемое.

Я не понимаю, почему GridGain пытается сериализовать свои родительские классы, которые не должны иметь ничего общего с сеткой, и можно ли их отключить?


person Jay Ebhomenye    schedule 16.09.2014    source источник


Ответы (2)


Из приведенного описания похоже, что вы отправляете анонимное закрытие/сообщение на удаленный узел.

Анонимные классы неявно захватывают ссылку на включающий класс, что заставляет GridGain сериализовать его. Чистое решение здесь состоит в том, чтобы переместить ваше анонимное закрытие/сообщение в статический внутренний класс. Таким образом, вы будете иметь полный контроль над тем, что сериализуется.

person Alexey    schedule 16.09.2014

Моя вина. Я нашел проблему, переключившись на Hazelcast. У меня есть класс мессенджера, который имеет метод получения и может регистрировать слушателя. Мессенджер находится в очереди в грид-кластере (GridGain или Hazelcast). Это требует, чтобы мессенджер был сериализуемым, что, в свою очередь, означает, что любой зарегистрированный слушатель также должен быть сериализуемым.

Мой шлюз имеет работающие обработчики, которые регистрируются в мессенджерах для обработки входящих сообщений. Следовательно, обратная сериализация.

Мне не удалось выяснить это с помощью GridGain, потому что GridGain выполняет сериализацию заранее, когда новый член присоединяется к сетке и пытается сериализовать все, что доступно из объектов в своих очередях, с другой стороны, Hazelcast не сериализуется до времени выполнения.

person Jay Ebhomenye    schedule 17.09.2014