2016-11-22 4 views
0

Ich habe einen Cluster auf Payara Server mit 3 Knoten (A, B & C) als Standalone-Instanzen implementiert. Ich verwende HAproxy als Load Balancer und alles funktioniert gut.Clustering Websockets Tyrus Java

Ich habe WebSockets in meinem Projekt hinzugefügt, und HAProxy schaltet automatisch vom HTTP- in den Tunnelmodus, wenn der Client einen Websocket anfordert.

Mein Problem ist das: Ich muss Websocket Sitzung unabhängig von angeschlossenen Knoten abrufen. Zum Beispiel: "Ich habe 3 Benutzer mit der Anwendung verbunden. Benutzer 1 und Benutzer 2 sind mit dem Knoten A verbunden. Benutzer 3 ist mit dem Knoten B verbunden. Ein Ereignis tritt auf dem Knoten C, die Benutzer 1 und 3 erfordert Ich habe jedoch keine Node C-Sitzungen für Benutzer 1 und 2 durchgeführt. "

Ich habe versucht, eine Hazelcast verteilte Liste zum Speichern von Sitzungen bei der Benutzerverbindung (OnOpen-Methode) zu verwenden. Aber wenn ich die "add" -Methode in der Liste aufgerufen habe, wird eine HazelcastSerializationException ausgelöst, weil das Tyrus-Sitzungsobjekt nicht serialisierbar ist.

Wie kann ich mein Problem lösen?

Dank

+1

Haben Sie versucht, eigene benutzerdefinierte Serializer-Methoden zu schreiben? http://StackOverflow.com/a/7290812/212224 – Mike

+0

Ja, ich habe versucht, aber es funktioniert nicht gut. Ich versuche, Hazelcast Executor Service zu verwenden, aber es verursacht com.hazelcast.nio.serialization.HazelcastSerializationException ion: java.lang.ClassNotFoundException: com.MyTask. –

Antwort

1

Ich bezweifle, dass die Übertragung von WebSocket-Sitzungen Ihnen helfen würde, da Sie die Benutzer über den Knoten benachrichtigen müssen, mit dem sie verbunden sind.

Wahrscheinlich möchten Sie die Knoten A und B vom Knoten C benachrichtigen, um die mit ihnen verbundenen Benutzer zu aktualisieren. Dazu können Sie Hazelcast Topic verwenden, um eine Nachricht an alle Knoten im Cluster zu senden und die Nachricht von dem Knoten abzurufen, der über die WebSocket-Sitzung (bearbeitet) verfügt. Sie müssen die Informationen von Knoten C an die anderen Knoten senden, die die Sitzung haben, und nicht umgekehrt. Das Übergeben einer Sitzung an einen anderen Knoten ist nicht sinnvoll, da die Sitzung nur für eine offene WebSocket-Verbindung gelten kann.

(bearbeitet) Vor schlug ich Hazelcast executor service anstelle des Themas zu verwenden, aber das verursacht Probleme Classloader.

+0

Ich habe mit Hazelcast Executor Service versucht.Meine Aufgabe implementiert Runnable & Serializable, aber wenn ich executorService.executeOnAllMembers (new MyTask (input)) aufgerufen habe, löst dies com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.MyTask auf den anderen Knoten aus. Nur, FYI ich Hazelcast Instanz auf diese Weise abrufen: Kontext ctx = new InitialContext(); HazelcastInstance instance = (HazelcastInstance) ctx.lookup ("Payara/Hazelcast"); –

+0

Es stimmt - ich wusste nicht, dass die eingebettete Hazelcast-Instanz aufgrund der Klassenpfadisolierung nicht auf Klassen zugreifen kann, die in bereitgestellten Anwendungen deklariert sind. Sende eine Nachricht mit einem [Hazelcast Topic] (https://hazelzelt.com/us-cases/imdg/imdg-messaging/) und platziere den Listener in die Anwendung (ich habe meine Antwort aktualisiert) – OndrejM

+0

Ich habe Hazelcast Topic und es verwendet scheint gut zu funktionieren. Danke für die Unterstützung. –

1

Bitte am StreamSerializer einen Blick haben, wenn Sie nicht wollen, zu/kann keine Serialisierung Logik zu Ihren Klassen hinzuzufügen.

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

Wenn Sie Serialisierung Logik hinzufügen können, müssen Sie einen Blick auf die IdentifiedDataSerializable:

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

Es gibt volle Beispiele im Referenzhandbuch.

Sie müssen sicherstellen, dass das Objekt wirklich serialisiert werden kann. Einige Objekte sollten niemals serialisiert werden.

+0

Danke für die Unterstützung, aber ich habe Hazelcast Topic für die Freigabe von Nachrichten auf Knoten verwendet, anstatt das Session-Objekt zu serialisieren. es ist kompliziert. –