Sorry for the late comment for old revision. I think that this fix causes IOE in StandardManager.doLoad().
L238 is following. Integer count = (Integer) ois.readObject(); IOException is thrown in this call because FileInputStream and BufferedInputStream instance have already been closed in try-with-resources block before. 2014-03-26 22:09 GMT+09:00 <ma...@apache.org>: > Author: markt > Date: Wed Mar 26 13:09:39 2014 > New Revision: 1581820 > > URL: http://svn.apache.org/r1581820 > Log: > More try-with-resources > > Modified: > tomcat/trunk/TOMCAT-NEXT.txt > tomcat/trunk/java/org/apache/catalina/session/JDBCStore.java > tomcat/trunk/java/org/apache/catalina/session/LocalStrings.properties > > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_es.properties > > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_fr.properties > > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_ja.properties > tomcat/trunk/java/org/apache/catalina/session/StandardManager.java > > Modified: tomcat/trunk/TOMCAT-NEXT.txt > URL: > http://svn.apache.org/viewvc/tomcat/trunk/TOMCAT-NEXT.txt?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- tomcat/trunk/TOMCAT-NEXT.txt (original) > +++ tomcat/trunk/TOMCAT-NEXT.txt Wed Mar 26 13:09:39 2014 > @@ -214,7 +214,7 @@ but possibly 7.1.x). > - Use of try with resources > - Started. > - javax.* complete > - - o.a.catalina.[ant to servlets] complete > + - o.a.catalina.[ant to session] complete > - remainder TODO > - Catching multiple exceptions > - Started > > Modified: tomcat/trunk/java/org/apache/catalina/session/JDBCStore.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/JDBCStore.java?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- tomcat/trunk/java/org/apache/catalina/session/JDBCStore.java (original) > +++ tomcat/trunk/java/org/apache/catalina/session/JDBCStore.java Wed Mar > 26 13:09:39 2014 > @@ -468,7 +468,6 @@ public class JDBCStore extends StoreBase > */ > @Override > public String[] keys() throws IOException { > - ResultSet rst = null; > String keys[] = null; > synchronized (this) { > int numberOfTries = 2; > @@ -487,16 +486,17 @@ public class JDBCStore extends StoreBase > } > > preparedKeysSql.setString(1, getName()); > - rst = preparedKeysSql.executeQuery(); > - ArrayList<String> tmpkeys = new ArrayList<>(); > - if (rst != null) { > - while (rst.next()) { > - tmpkeys.add(rst.getString(1)); > + try (ResultSet rst = preparedKeysSql.executeQuery()) { > + ArrayList<String> tmpkeys = new ArrayList<>(); > + if (rst != null) { > + while (rst.next()) { > + tmpkeys.add(rst.getString(1)); > + } > } > + keys = tmpkeys.toArray(new > String[tmpkeys.size()]); > + // Break out after the finally block > + numberOfTries = 0; > } > - keys = tmpkeys.toArray(new String[tmpkeys.size()]); > - // Break out after the finally block > - numberOfTries = 0; > } catch (SQLException e) { > > manager.getContext().getLogger().error(sm.getString(getStoreName() + > ".SQLException", e)); > keys = new String[0]; > @@ -504,21 +504,12 @@ public class JDBCStore extends StoreBase > if (dbConnection != null) > close(dbConnection); > } finally { > - try { > - if (rst != null) { > - rst.close(); > - } > - } catch (SQLException e) { > - // Ignore > - } > - > release(_conn); > } > numberOfTries--; > } > } > - > - return (keys); > + return keys; > } > > /** > @@ -531,7 +522,6 @@ public class JDBCStore extends StoreBase > @Override > public int getSize() throws IOException { > int size = 0; > - ResultSet rst = null; > > synchronized (this) { > int numberOfTries = 2; > @@ -551,30 +541,24 @@ public class JDBCStore extends StoreBase > } > > preparedSizeSql.setString(1, getName()); > - rst = preparedSizeSql.executeQuery(); > - if (rst.next()) { > - size = rst.getInt(1); > + try (ResultSet rst = preparedSizeSql.executeQuery()) { > + if (rst.next()) { > + size = rst.getInt(1); > + } > + // Break out after the finally block > + numberOfTries = 0; > } > - // Break out after the finally block > - numberOfTries = 0; > } catch (SQLException e) { > > manager.getContext().getLogger().error(sm.getString(getStoreName() + > ".SQLException", e)); > if (dbConnection != null) > close(dbConnection); > } finally { > - try { > - if (rst != null) > - rst.close(); > - } catch (SQLException e) { > - // Ignore > - } > - > release(_conn); > } > numberOfTries--; > } > } > - return (size); > + return size; > } > > /** > @@ -587,9 +571,7 @@ public class JDBCStore extends StoreBase > * @exception IOException if an input/output error occurred > */ > @Override > - public Session load(String id) > - throws ClassNotFoundException, IOException { > - ResultSet rst = null; > + public Session load(String id) throws ClassNotFoundException, > IOException { > StandardSession _session = null; > Loader loader = null; > ClassLoader classLoader = null; > @@ -617,49 +599,43 @@ public class JDBCStore extends StoreBase > > preparedLoadSql.setString(1, id); > preparedLoadSql.setString(2, getName()); > - rst = preparedLoadSql.executeQuery(); > - if (rst.next()) { > - bis = new > BufferedInputStream(rst.getBinaryStream(2)); > - > - if (context != null) { > - loader = context.getLoader(); > - } > - if (loader != null) { > - classLoader = loader.getClassLoader(); > - } > - if (classLoader != null) { > - > Thread.currentThread().setContextClassLoader(classLoader); > - ois = new CustomObjectInputStream(bis, > - classLoader); > - } else { > - ois = new ObjectInputStream(bis); > - } > - > - if > (manager.getContext().getLogger().isDebugEnabled()) { > - > manager.getContext().getLogger().debug(sm.getString(getStoreName() + > ".loading", > - id, sessionTable)); > + try (ResultSet rst = preparedLoadSql.executeQuery()) { > + if (rst.next()) { > + bis = new > BufferedInputStream(rst.getBinaryStream(2)); > + > + if (context != null) { > + loader = context.getLoader(); > + } > + if (loader != null) { > + classLoader = loader.getClassLoader(); > + } > + if (classLoader != null) { > + > Thread.currentThread().setContextClassLoader(classLoader); > + ois = new CustomObjectInputStream(bis, > + classLoader); > + } else { > + ois = new ObjectInputStream(bis); > + } > + > + if > (manager.getContext().getLogger().isDebugEnabled()) { > + > manager.getContext().getLogger().debug(sm.getString(getStoreName() + > ".loading", > + id, sessionTable)); > + } > + > + _session = (StandardSession) > manager.createEmptySession(); > + _session.readObjectData(ois); > + _session.setManager(manager); > + } else if > (manager.getContext().getLogger().isDebugEnabled()) { > + > manager.getContext().getLogger().debug(getStoreName() + ": No persisted > data object found"); > } > - > - _session = (StandardSession) > manager.createEmptySession(); > - _session.readObjectData(ois); > - _session.setManager(manager); > - } else if > (manager.getContext().getLogger().isDebugEnabled()) { > - > manager.getContext().getLogger().debug(getStoreName() + ": No persisted > data object found"); > + // Break out after the finally block > + numberOfTries = 0; > } > - // Break out after the finally block > - numberOfTries = 0; > } catch (SQLException e) { > > manager.getContext().getLogger().error(sm.getString(getStoreName() + > ".SQLException", e)); > if (dbConnection != null) > close(dbConnection); > } finally { > - try { > - if (rst != null) { > - rst.close(); > - } > - } catch (SQLException e) { > - // Ignore > - } > if (ois != null) { > try { > ois.close(); > @@ -787,10 +763,7 @@ public class JDBCStore extends StoreBase > */ > @Override > public void save(Session session) throws IOException { > - ObjectOutputStream oos = null; > ByteArrayOutputStream bos = null; > - ByteArrayInputStream bis = null; > - InputStream in = null; > > synchronized (this) { > int numberOfTries = 2; > @@ -807,35 +780,34 @@ public class JDBCStore extends StoreBase > remove(session.getIdInternal(), _conn); > > bos = new ByteArrayOutputStream(); > - oos = new ObjectOutputStream(new > BufferedOutputStream(bos)); > - > - ((StandardSession) session).writeObjectData(oos); > - oos.close(); > - oos = null; > + try (ObjectOutputStream oos = > + new ObjectOutputStream(new > BufferedOutputStream(bos))) { > + ((StandardSession) session).writeObjectData(oos); > + } > byte[] obs = bos.toByteArray(); > int size = obs.length; > - bis = new ByteArrayInputStream(obs, 0, size); > - in = new BufferedInputStream(bis, size); > + try (ByteArrayInputStream bis = new > ByteArrayInputStream(obs, 0, size); > + InputStream in = new BufferedInputStream(bis, > size)) { > + if (preparedSaveSql == null) { > + String saveSql = "INSERT INTO " + > sessionTable + " (" > + + sessionIdCol + ", " + sessionAppCol + ", > " > + + sessionDataCol + ", " + sessionValidCol > + + ", " + sessionMaxInactiveCol + ", " > + + sessionLastAccessedCol > + + ") VALUES (?, ?, ?, ?, ?, ?)"; > + preparedSaveSql = > _conn.prepareStatement(saveSql); > + } > > - if (preparedSaveSql == null) { > - String saveSql = "INSERT INTO " + sessionTable + > " (" > - + sessionIdCol + ", " + sessionAppCol + ", " > - + sessionDataCol + ", " + sessionValidCol > - + ", " + sessionMaxInactiveCol + ", " > - + sessionLastAccessedCol > - + ") VALUES (?, ?, ?, ?, ?, ?)"; > - preparedSaveSql = _conn.prepareStatement(saveSql); > + preparedSaveSql.setString(1, > session.getIdInternal()); > + preparedSaveSql.setString(2, getName()); > + preparedSaveSql.setBinaryStream(3, in, size); > + preparedSaveSql.setString(4, session.isValid() ? > "1" : "0"); > + preparedSaveSql.setInt(5, > session.getMaxInactiveInterval()); > + preparedSaveSql.setLong(6, > session.getLastAccessedTime()); > + preparedSaveSql.execute(); > + // Break out after the finally block > + numberOfTries = 0; > } > - > - preparedSaveSql.setString(1, session.getIdInternal()); > - preparedSaveSql.setString(2, getName()); > - preparedSaveSql.setBinaryStream(3, in, size); > - preparedSaveSql.setString(4, session.isValid() ? "1" > : "0"); > - preparedSaveSql.setInt(5, > session.getMaxInactiveInterval()); > - preparedSaveSql.setLong(6, > session.getLastAccessedTime()); > - preparedSaveSql.execute(); > - // Break out after the finally block > - numberOfTries = 0; > } catch (SQLException e) { > > manager.getContext().getLogger().error(sm.getString(getStoreName() + > ".SQLException", e)); > if (dbConnection != null) > @@ -843,16 +815,6 @@ public class JDBCStore extends StoreBase > } catch (IOException e) { > // Ignore > } finally { > - if (oos != null) { > - oos.close(); > - } > - if (bis != null) { > - bis.close(); > - } > - if (in != null) { > - in.close(); > - } > - > release(_conn); > } > numberOfTries--; > > Modified: > tomcat/trunk/java/org/apache/catalina/session/LocalStrings.properties > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/LocalStrings.properties?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- tomcat/trunk/java/org/apache/catalina/session/LocalStrings.properties > (original) > +++ tomcat/trunk/java/org/apache/catalina/session/LocalStrings.properties > Wed Mar 26 13:09:39 2014 > @@ -34,8 +34,7 @@ managerBase.container.noop=Managers adde > managerBase.createSession.ise=createSession: Too many active sessions > managerBase.sessionTimeout=Invalid session timeout setting {0} > standardManager.loading=Loading persisted sessions from {0} > -standardManager.loading.cnfe=ClassNotFoundException while loading > persisted sessions: {0} > -standardManager.loading.ioe=IOException while loading persisted sessions: > {0} > +standardManager.loading.exception=Exception while loading persisted > sessions > standardManager.unloading=Saving persisted sessions to {0} > standardManager.unloading.debug=Unloading persisted sessions > standardManager.unloading.ioe=IOException while saving persisted > sessions: {0} > > Modified: > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_es.properties > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/LocalStrings_es.properties?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_es.properties > (original) > +++ > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_es.properties > Wed Mar 26 13:09:39 2014 > @@ -27,8 +27,7 @@ JDBCStore.checkConnectionClassNotFoundEx > managerBase.createSession.ise = createSession\: Demasiadas sesiones > activas > managerBase.sessionTimeout = Valor inv\u00E1lido de Tiempo Agotado de > sesi\u00F3n {0} > standardManager.loading = Cargando sesiones persistidas desde {0} > -standardManager.loading.cnfe = ClassNotFoundException al cargar sesiones > persistidas\: {0} > -standardManager.loading.ioe = IOException al cargar sesiones > persistidas\: {0} > +standardManager.loading.exception = Exception al cargar sesiones > persistidas > standardManager.unloading = Salvando sesiones persistidas a {0} > standardManager.unloading.ioe = IOException al salvar sesiones > persistidas\: {0} > standardManager.managerLoad = Excepci\u00F3n cargando sesiones desde > almacenamiento persistente > > Modified: > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_fr.properties > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/LocalStrings_fr.properties?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_fr.properties > (original) > +++ > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_fr.properties > Wed Mar 26 13:09:39 2014 > @@ -27,8 +27,7 @@ JDBCStore.checkConnectionClassNotFoundEx > managerBase.createSession.ise="createSession": Trop de sessions actives > managerBase.sessionTimeout=R\u00e9glage du d\u00e9lai d''inactivit\u00e9 > (timeout) de session invalide {0} > standardManager.loading=Chargement des sessions qui ont persist\u00e9 > depuis {0} > -standardManager.loading.cnfe="ClassNotFoundException" lors du chargement > de sessions persistantes: {0} > -standardManager.loading.ioe="IOException" lors du chargement de sessions > persistantes: {0} > +standardManager.loading.exception="Exception" lors du chargement de > sessions persistantes > standardManager.unloading=Sauvegarde des sessions ayant persist\u00e9 > vers {0} > standardManager.unloading.ioe="IOException" lors de la sauvegarde de > sessions persistantes: {0} > standardManager.managerLoad=Exception au chargement des sessions depuis > le stockage persistant (persistent storage) > > Modified: > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_ja.properties > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/LocalStrings_ja.properties?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_ja.properties > (original) > +++ > tomcat/trunk/java/org/apache/catalina/session/LocalStrings_ja.properties > Wed Mar 26 13:09:39 2014 > @@ -28,8 +28,7 @@ JDBCStore.checkConnectionClassNotFoundEx > managerBase.createSession.ise=createSession: > \u30a2\u30af\u30c6\u30a3\u30d6\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u591a\u3059\u304e\u307e\u3059 > > managerBase.sessionTimeout=\u7121\u52b9\u306a\u30bb\u30c3\u30b7\u30e7\u30f3\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u8a2d\u5b9a\u3067\u3059 > {0} > standardManager.loading={0} > \u304b\u3089\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059 > -standardManager.loading.cnfe=\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30c9\u4e2d\u306bClassNotFoundException\u304c\u767a\u751f\u3057\u307e\u3057\u305f: > {0} > -standardManager.loading.ioe=\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30c9\u4e2d\u306eIOException\u3067\u3059: > {0} > > +standardManager.loading.exception=\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30c9\u4e2d\u306bException\u304c\u767a\u751f\u3057\u307e\u3057\u305f > > standardManager.unloading=\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u3092 > {0} \u306b\u4fdd\u5b58\u3057\u307e\u3059 > > standardManager.unloading.ioe=\u6301\u7d9a\u3055\u308c\u305f\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u4fdd\u5b58\u4e2d\u306eIOException\u3067\u3059: > {0} > > > standardManager.managerLoad=\u6c38\u7d9a\u8a18\u61b6\u88c5\u7f6e\u304b\u3089\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30c9\u4e2d\u306e\u4f8b\u5916\u3067\u3059 > > Modified: > tomcat/trunk/java/org/apache/catalina/session/StandardManager.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/StandardManager.java?rev=1581820&r1=1581819&r2=1581820&view=diff > > ============================================================================== > --- tomcat/trunk/java/org/apache/catalina/session/StandardManager.java > (original) > +++ tomcat/trunk/java/org/apache/catalina/session/StandardManager.java Wed > Mar 26 13:09:39 2014 > @@ -204,14 +204,11 @@ public class StandardManager extends Man > return; > if (log.isDebugEnabled()) > log.debug(sm.getString("standardManager.loading", pathname)); > - FileInputStream fis = null; > - BufferedInputStream bis = null; > ObjectInputStream ois = null; > Loader loader = null; > ClassLoader classLoader = null; > - try { > - fis = new FileInputStream(file.getAbsolutePath()); > - bis = new BufferedInputStream(fis); > + try (FileInputStream fis = new > FileInputStream(file.getAbsolutePath()); > + BufferedInputStream bis = new BufferedInputStream(fis)) { > Context c = getContext(); > if (c != null) > loader = c.getLoader(); > @@ -232,20 +229,6 @@ public class StandardManager extends Man > return; > } catch (IOException e) { > log.error(sm.getString("standardManager.loading.ioe", e), e); > - if (fis != null) { > - try { > - fis.close(); > - } catch (IOException f) { > - // Ignore > - } > - } > - if (bis != null) { > - try { > - bis.close(); > - } catch (IOException f) { > - // Ignore > - } > - } > throw e; > } > > @@ -270,21 +253,8 @@ public class StandardManager extends Man > } > sessionCounter++; > } > - } catch (ClassNotFoundException e) { > - log.error(sm.getString("standardManager.loading.cnfe", > e), e); > - try { > - ois.close(); > - } catch (IOException f) { > - // Ignore > - } > - throw e; > - } catch (IOException e) { > - log.error(sm.getString("standardManager.loading.ioe", e), > e); > - try { > - ois.close(); > - } catch (IOException f) { > - // Ignore > - } > + } catch (ClassNotFoundException | IOException e) { > + > log.error(sm.getString("standardManager.loading.exception"), e); > throw e; > } finally { > // Close the input stream > @@ -339,7 +309,6 @@ public class StandardManager extends Man > * > * @exception IOException if an input/output error occurs > */ > - @SuppressWarnings("null") > protected void doUnload() throws IOException { > > if (log.isDebugEnabled()) > @@ -356,51 +325,16 @@ public class StandardManager extends Man > return; > if (log.isDebugEnabled()) > log.debug(sm.getString("standardManager.unloading", > pathname)); > - FileOutputStream fos = null; > - BufferedOutputStream bos = null; > - ObjectOutputStream oos = null; > - boolean error = false; > - try { > - fos = new FileOutputStream(file.getAbsolutePath()); > - bos = new BufferedOutputStream(fos); > - oos = new ObjectOutputStream(bos); > - } catch (IOException e) { > - error = true; > - log.error(sm.getString("standardManager.unloading.ioe", e), > e); > - throw e; > - } finally { > - if (error) { > - if (oos != null) { > - try { > - oos.close(); > - } catch (IOException ioe) { > - // Ignore > - } > - } > - if (bos != null) { > - try { > - bos.close(); > - } catch (IOException ioe) { > - // Ignore > - } > - } > - if (fos != null) { > - try { > - fos.close(); > - } catch (IOException ioe) { > - // Ignore > - } > - } > - } > - } > - > - // Write the number of active sessions, followed by the details > ArrayList<StandardSession> list = new ArrayList<>(); > - synchronized (sessions) { > - if (log.isDebugEnabled()) > - log.debug("Unloading " + sessions.size() + " sessions"); > - try { > - // oos can't be null here > + try (FileOutputStream fos = new > FileOutputStream(file.getAbsolutePath()); > + BufferedOutputStream bos = new BufferedOutputStream(fos); > + ObjectOutputStream oos = new ObjectOutputStream(bos)) { > + > + // Write the number of active sessions, followed by the > details > + synchronized (sessions) { > + if (log.isDebugEnabled()) > + log.debug("Unloading " + sessions.size() + " > sessions"); > + > oos.writeObject(new Integer(sessions.size())); > Iterator<Session> elements = sessions.values().iterator(); > while (elements.hasNext()) { > @@ -410,26 +344,10 @@ public class StandardManager extends Man > session.passivate(); > session.writeObjectData(oos); > } > - } catch (IOException e) { > - log.error(sm.getString("standardManager.unloading.ioe", > e), e); > - try { > - oos.close(); > - } catch (IOException f) { > - // Ignore > - } > - throw e; > - } > - } > - > - // Flush and close the output stream > - try { > - oos.flush(); > - } finally { > - try { > - oos.close(); > - } catch (IOException f) { > - // Ignore > } > + } catch (IOException e) { > + log.error(sm.getString("standardManager.unloading.ioe", e), > e); > + throw e; > } > > // Expire all the sessions we just wrote > @@ -449,7 +367,6 @@ public class StandardManager extends Man > > if (log.isDebugEnabled()) > log.debug("Unloading complete"); > - > } > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > -- > Keiichi.Fujino <dev-h...@tomcat.apache.org>