2017-09-22 3 views
0

Ich lerne Java API für WebSockets und ich habe eine Frage. Jedes Mal, wenn ich an den Endpunkt verbinden, erstellt die App 2 Anschlüsse und die erste wirft diese Ausnahme:Java EE WebSockets in Glassfish möglich "Zombie" Verbindung

Info: websocketbot was successfully deployed in 3,174 milliseconds. 
Info: (@OnOpen method) Connection opened. 
Info: (@OnOpen method) Opened connections: 1 
Warning: Already set read listener 
java.lang.IllegalStateException: Already set read listener 
    at org.apache.catalina.connector.InputBuffer.setReadListener(InputBuffer.java:303) 
    at org.apache.catalina.connector.CoyoteInputStream.setReadListener(CoyoteInputStream.java:312) 
    at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.init(TyrusHttpUpgradeHandler.java:105) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:777) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:413) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:748) 

Info: Connection opened. 
Info: Opened connections: 2 

Meine Klasse Endpoint:.

package pckg; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.websocket.OnClose; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 

@ServerEndpoint("/echo") 
public class TestEndpoint { 

    private static final Logger logger = Logger.getLogger("TestEndpoint"); 

    @OnOpen 
    public void open(Session session) { 
     logger.log(Level.INFO, "(@OnOpen method) Connection opened."); 
     logger.log(Level.INFO, "(@OnOpen method) Opened connections:" 
       + session.getOpenSessions().size()); 
    } 

    @OnClose 
    public void close(Session session) { 
     logger.log(Level.INFO, "(@OnClose method) Connection closed."); 
     logger.log(Level.INFO, "(@OnClose method) Opened connections:" 
       + session.getOpenSessions().size()); 
    } 
} 

Wenn ich die Verbindung zu schließen (zB in der Nähe der Browser) nur eine Session-Instanz ist geschlossen.

Wenn ich @OnMessage-Methode zum Empfangen von Nachrichten und eine Methode zum Senden einer Nachricht implementiert habe, erhalte ich jede Nachricht zweimal.

Was ich fragen möchte ist, ob das passieren soll. Ich benutze NetBeans und GlassFish Server, mit denen ich in der Vergangenheit Probleme hatte.

PS: Ich habe auch eine Beispielanwendung aus dem offiziellen Oracle-Tutorial namens "websocketbot" (eine Chat-Implementierung) versucht. Seine Nachrichten werden auch dupliziert, obwohl sie es eindeutig nicht tun sollten. Ich musste auch etwas Code hinzufügen, damit es 100% funktioniert.

EDIT: Das Problem war in der Tat mit GlassFish. Es funktioniert auf dem WildFly-Server.

+0

Öffnen Sie die Verbindung in Javascript? –

+0

Können Sie auch mit [Payara Server] (http://www.payara.fish) testen? Es ist von GlassFish abgeleitet und wenn es in Payara Server funktioniert, ist es sehr wahrscheinlich, dass es ein Fehler in GlassFish ist. – OndrejM

Antwort

Verwandte Themen