2017-09-22 1 views
0

J'apprends l'API Java pour WebSockets et j'ai une question. Chaque fois que je me connecte au point d'extrémité, l'application crée 2 connexions et le premier jette cette exception:Java EE WebSockets dans Glassfish possible connexion "zombie"

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 

My Endpoint classe.

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()); 
    } 
} 

Quand je ferme la connexion (par exemple, fermer la navigateur) une seule instance de session est fermée.

Lorsque j'ai implémenté la méthode @OnMessage pour recevoir des messages et une méthode pour envoyer un message, je reçois chaque message deux fois.

Ce que je veux demander, c'est si cela est supposé se produire. J'utilise NetBeans et le serveur GlassFish avec lequel j'ai eu des problèmes dans le passé. PS: J'ai également essayé un exemple d'application du tutoriel officiel Oracle appelé "websocketbot" (une implémentation de chat). Ses messages sont également dupliqués même s'ils ne le devraient clairement pas. J'ai aussi dû ajouter du code pour le faire fonctionner à 100%.

EDIT: Le problème était en effet avec GlassFish. Cela fonctionne bien sur le serveur WildFly.

+0

Avez-vous ouvert la connexion en javascript? –

+0

Pouvez-vous tester avec [Payara Server] (http://www.payara.fish) aussi? Il est dérivé de GlassFish et s'il fonctionne dans Payara Server, il est très probable que c'est un bug dans GlassFish. – OndrejM

Répondre