2016-11-22 3 views
0

Я реализовал кластер на сервере Payara с 3 узлами (A, B & C) в качестве автономных экземпляров. Я использую HAproxy в качестве балансировки нагрузки, и все работает нормально.Clustering Websockets Tyrus Java

Я добавил WebSockets в свой проект, и HAProxy автоматически переключается с HTTP на туннельный режим, когда клиент запрашивает websocket.

Моя проблема заключается в следующем: Мне нужно получить сеанс websocket независимо от подключенного узла. Например: «У меня есть 3 пользователя, подключенных к приложению. Пользователь 1 и Пользователь 2 подключены к узлу А. Пользователь 3 - , подключенный к узлу B. Событие возникает на узле C, для которого пользователю 1 и 3 требуется но я не участвую в сеансах Node C User 1 и User 2 ».

Я попытался использовать распределенный список Hazelcast для хранения сеансов в пользовательском соединении (метод OnOpen). Но когда я назвал метод «добавить» в списке, это исключает исключение HazelcastSerializationException, поскольку объект сеанса Tyrus не является Serializable.

Как я могу решить свою проблему?

Благодаря

+1

Вы пытались написать свои собственные методы сериализации? http://stackoverflow.com/a/7290812/212224 – Mike

+0

Да, я пробовал, но это не работает. Я пытаюсь использовать Hazelcast Executor Service, но это вызывает com.hazelcast.nio.serialization.HazelcastSerializationExcept ion: java.lang.ClassNotFoundException: com.MyTask. –

ответ

1

Я сомневаюсь, что передача сеансов WebSocket поможет вам, так как вам необходимо уведомить пользователей об узле, к которому они подключены.

Возможно, вы хотите уведомить узлы A и B из узла C, чтобы обновить пользователей, подключенных к ним. Для этого вы можете использовать Hazelcast Topic, чтобы отправить сообщение всем узлам кластера и получить сообщение узлом, который имеет сеанс WebSocket (, отредактированный). Вам нужно получить информацию от узла C до других узлов, у которых есть сеанс, а не наоборот. Передача сеанса другому узлу была бы бесполезной, поскольку сеанс применим только к открытому соединению WebSocket.

(под редакцией) Прежде чем я предложил использовать Hazelcast executor service вместо Topic, но это вызывает проблемы ClassLoader.

+0

Я попробовал сервис исполнителя Hazelcast.Моя задача реализует Runnable и Сериализуемой, но когда я назвал executorService.executeOnAllMembers (новый MyTask (вход)), это бросает com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.MyTask на других узлах. Просто, FYI, я получаю экземпляр Hazelcast таким образом: Context ctx = new InitialContext(); Случай HazelcastInstance = (HazelcastInstance) ctx.lookup ("payara/Hazelcast"); –

+0

Это правда - я не понимал, что встроенный экземпляр Hazelcast не может обращаться к классам, объявленным в развернутых приложениях, из-за изоляции класса. Попробуйте транслирует сообщение с помощью [Hazelcast Тема] (https://hazelcast.com/use-cases/imdg/imdg-messaging/) и поместить слушателя в приложение (я обновил свой ответ) – OndrejM

+0

я Hazelcast Тема и его похоже работа хорошо. Спасибо за поддержку. –

1

Пожалуйста, посмотрите на StreamSerializer, если вы не хотите к/не может добавить любой сериализации логики к классам.

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#custom-serialization

Если вы можете добавить логику сериализации, пожалуйста, посмотрите на IdentifiedDataSerializable:

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#identifieddataserializable

Есть полные примеры в справочном руководстве.

Вам необходимо убедиться, что объект действительно может быть сериализован. Некоторые объекты никогда не должны быть сериализованы.

+0

Спасибо за поддержку, но я предпочел использовать тему Hazelcast Topic для обмена сообщениями на узлах, а не для сериализации объекта сеанса. это сложно. –

Смежные вопросы