Wie man eine bestehende websocket-Instanz
Arbeite ich an einer Anwendung, die verwendet Websockets (Java EE 7) zum senden von Nachrichten an alle verbundenen clients asynchron. Der server (Websocket endpoint) sollten diese Nachrichten schicken, Wann immer ein neuer Artikel (ein engagement modal in meiner app) erstellt.
Jedes mal wenn eine Verbindung hergestellt ist, um die websocket endpoint, ich bin das hinzufügen der entsprechenden Sitzung eine Liste, die ich könnte in der Lage sein, um Zugang von außerhalb.
Aber das problem, das ich hatte ist, wenn ich Zugriff auf diese erstellt websocket endpoint, auf die alle angeschlossenen clients von außerhalb (andere business-Klasse), ich habe bekommen, wird die vorhandene Instanz (wie ein singleton).
Also, können Sie bitte empfehlen Sie mir eine Art, wie ich eine vorhandene Instanz des websocket endpoint, ich kann Sie nicht erstellen Sie es als neue MyWebsocketEndPoint() coz es wird erstellt, indem die websocket-interner Mechanismus, der, wenn die Anfrage von einem client empfangen wird.
Für ein ref:
private static WebSocketEndPoint INSTANCE = null;
public static WebSocketEndPoint getInstance() {
if(INSTANCE == null) {
//Instead of creating a new instance, I need an existing one
INSTANCE = new WebSocketEndPoint ();
}
return INSTANCE;
}
Vielen Dank im Voraus.
InformationsquelleAutor Aryan Venkat | 2013-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den container erstellt eine separate Instanz des Endpunkts für jede client-Verbindung, so dass Sie nicht tun können, was Sie zu tun versuchen. Aber ich denke, was Sie versuchen zu tun, ist senden Sie eine Nachricht an alle aktiven client-verbindungen wenn ein Ereignis Eintritt, das ist ziemlich einfach.
Den
javax.websocket.Session
Klasse hat diegetBasicRemote
Methode zum abrufen einerRemoteEndpoint.Basic
Instanz, stellt den Endpunkt im Zusammenhang mit der Tagung.Können Sie abrufen, alle offenen Sitzungen durch den Aufruf
Session.getOpenSessions()
, dann Durchlaufen Sie. Die Schleife sendet jede client-Verbindung eine Nachricht. Hier ein einfaches Beispiel:Aber in Ihrem Fall, werden Sie wahrscheinlich verwenden wollen, CDI-events auslösen, das update auf allen clients. In diesem Fall würden Sie erstellen ein CDI-Fall, dass eine Methode in der Websocket endpoint-Klasse beobachtet:
EJB-im obigen Beispiel würde so etwas machen:
Finden Sie unter Java EE 7 Tutorial Kapitel auf WebSockets und CDI-Events.
Bearbeiten: Verändert die
@Observer
Methode, um ein Ereignis als parameter.Edit 2: gewickelt, der loop-in-broadcastArticle in synchronisiert, pro @gcvt.
Edit 3: links Aktualisiert, um Java EE 7 Tutorial. Netter job, Oracle. Sheesh.
Das Beispiel oben ist nur eine Allgemeine Architektur. Sie nicht haben die Verwendung von EJBs. In deinem Fall
ArticleHandler
Spritzen würde die Veranstaltung und Feuer. So weit wie der Zugriff auf die Sitzungen, bewegen Sie denSet<Session>
Sammlung um ein singleton, und rufen Sie den singleton aus Ihrer endpoint-Klasse zum speichern der Sitzungen. Die singleton wäre dann einegetSessions()
- Methode zum abrufen der aktuellen Sitzungen.In
broadcastArticle
Sie tun solltensynchronized(sessions)
vor der for-Schleife.Java EE 7 links sind 404.
Ja, Sie sollten in der Lage sein, das zu tun, wenn der CDI-container unterstützt.
InformationsquelleAutor Ian Evans
Eigentlich WebSocket-API bietet eine Möglichkeit, wie Sie Steuern können, Endpunkt der Instanziierung. Sehen https://tyrus.java.net/apidocs/1.2.1/javax/websocket/server/ServerEndpointConfig.Configurator.html
einfaches Beispiel (entnommen aus Tyrus - WebSocket-RI test):
Müssen Sie diese registrieren, um einen Endpunkt:
oder Sie können es verwenden, um programmatische Endpunkte:
Natürlich ist es bis zu Ihnen, wenn Sie haben ein Konfigurator für alle Endpunkte (hässlich ifs-so präsentiert snippet) oder wenn Sie für die Erstellung von separaten Konfigurator für jeden Endpunkt.
Bitte nicht kopieren code vorgestellt, wie es ist - dies ist nur ein Teil von Tyrus tests und es hat gegen einige der grundlegenden OOM Paradigmen.
Sehen https://github.com/tyrus-project/tyrus/blob/1.2.1/tests/e2e/src/test/java/org/glassfish/tyrus/test/e2e/GetEndpointInstanceTest.java für den vollständigen test.
InformationsquelleAutor Pavel Bucek