Questa è una domanda veramente difficile, almeno per me che è na settimana ci sbatto la testa e non riesco arisolvere nulla.
Il mio problema è il seguente: ho un webservice che, una volta ricevuta una request, per costruire la response deve interrogare uno o più server. L'applicazione funziona già perfettamente, ma per migliorare le prestazioni mi è stato chiesto di gestire le connessioni con socket in modalità keep-alive.
Se avessi interrogato sempre il solito server non sarebbe stato un problema, ma a seconda del servizio richiesto la chiamata esterna principale può variare e devo interrogare server diversi censiti su db.
Qui nasce il problema: non potendo creare una classe java per ogni server (non posso mettere mano al codice ogni volta che si vuole aggiungere un servizio), una volta creato il socket lo vado a memorizzare in una final static HashMap, ma appena lo memorizzo in una qualsivoglia struttura dati il socket mi chiude tutti gli stream (da e verso il server)
Cerco disperatamente una soluzione al problemacodice:public Socket getSocket(URL myUrl, String ServiceId, String SessId) throws IOException { if(SessId == null) SessId = ""; if(ServiceId == null) ServiceId = ""; String host = myUrl.getHost(); int port = myUrl.getPort(); if (port == -1) port = (myUrl.getProtocol().indexOf("https") >= 0) ? 443 : 80; con = (Socket) connections.get(ServiceId+host+port); log.debug("socket=" + con); if(con != null) log.debug("Socket "+(con.getKeepAlive() ? "Keep Alive " : "Keep Dead ")+(con.isClosed() ? "Chiuso ":"Aperto ")+(con.isOutputShutdown() ? "OS down":"OS up")); if(con == null || con.isOutputShutdown()|| con.isClosed()) { if(con != null) { con.close(); log.debug("###### Ripristino connessione "+ServiceId+host+":"+port+" trovata chiusa#####"); } else { log.debug("###### Creata connessione "+ServiceId+host+":"+port+" #####"); } con = sFactory.createSocket(); //connections.put(ServiceId+host+port, con); if (log != null) log.debug(ServiceId + " " + SessId + " - Connecting to socket " + host + " : " + port+(con.getKeepAlive()?" is Keep-alive" : " is not Keep-alive")+(con.isClosed()?" is Close" : " is Open")); } else { log.debug("###### Recuperata connessione "+ServiceId+host+":"+port+" #####"); } if(!con.isConnected()) { con.connect(new InetSocketAddress(host, port), this.connect_timeout); } con.setSoTimeout(this.read_timeout*10); con.setKeepAlive(true); return con; }

Rispondi quotando