Details
-
Bug
-
Resolution: Obsolete
-
Major
-
None
-
JBossAS-3.2.7 Final
-
None
Description
The CMP engine reports a technical error (in our case a failure to gracefully handle database restart) as an application-level FinderException.
The EJB spec (18.2.2) clearly states that non-application exceptions should be used to report this kind of conditions.
"This subsection describes how the Bean Provider should handle various system-level exceptions and
errors that an enterprise bean instance may encounter during the execution of a session or entity bean
business method, /.../
Examples of such exceptions and errors are: failure to obtain a
database connection,/.../
If the enterprise bean method encounters a system-level exception or error that does not allow the
method to successfully complete, the method SHOULD THROW A SUITABLE NON-APPLICATION EXCEPTION [submitter's cap] that is
compatible with the method?s throws clause. /.../"
Furthermore, the javadoc of FinderException clearly states that FinderExcepiton is an application-exception
"The exception is used as a standard APPLICATION-LEVEL EXCEPTION [submitter's cap] to report a failure to find /.../"
However, the JBoss implementation nevertheless throws a FinderException in this situation.
REPRODUCTION
Setting: JBoss with CMP, Oracle 9 DB
1) Start DB
2) Start JBoss w deployed application
3) Make call to finder method (pool is now loaded)
4) Restart database
5) Make call to finder method (will find trashed connections in the pool)
EXPECTED: JBoss gracefully recovers the pool (not requested) or reports problem using system exception
ACTUAL: JBoss reports FinderException
And here are some stacktraces that might help:
Restart of database causes trashed connections:
2005-12-06 10:01:30,769 WARN [org.jboss.resource.connectionmanager.JBossManagedConnectionPool] Exception destroying ManagedConnection org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@1ae42b1[state=DESTROYED mc=org.jboss.resource.adapter.jdbc.xa.XAManagedConnection@b758b3 handles=0 lastUse=1133858776437 permit=false trackByTx=false mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$OnePool@1efc3d2 context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@833a2d]
org.jboss.resource.JBossResourceException: SQLException; - nested throwable: (java.sql.SQLException: I/O-undantag: Connection reset by peer: socket write error)
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.checkException(BaseWrapperManagedConnection.java:572)
at org.jboss.resource.adapter.jdbc.xa.XAManagedConnection.destroy(XAManagedConnection.java:110)
at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.doDestroy(InternalManagedConnectionPool.java:539)
at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.removeTimedOut(InternalManagedConnectionPool.java:415)
at org.jboss.resource.connectionmanager.IdleRemover$1.run(IdleRemover.java:70)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.sql.SQLException: I/O-undantag: Connection reset by peer: socket write error
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:334)
at oracle.jdbc.ttc7.TTC7Protocol.handleIOException(TTC7Protocol.java:3678)
at oracle.jdbc.ttc7.TTC7Protocol.logoff(TTC7Protocol.java:400)
at oracle.jdbc.driver.OracleConnection.close(OracleConnection.java:1504)
at oracle.jdbc.pool.OraclePooledConnection.close(OraclePooledConnection.java:259)
at org.jboss.resource.adapter.jdbc.xa.XAManagedConnection.destroy(XAManagedConnection.java:106)
... 4 more
CMP engine reports failed find
2005-12-06 10:02:23,409 ERROR org.jboss.ejb.plugins.cmp.jdbc.JDBCEJBQLQuery.ScannedDocument#findAvailableForLocationSinceTimestamp Find failed
org.jboss.util.NestedSQLException: Failure to delist resource; - nested throwable: (javax.resource.ResourceException: Failure to delist resource)
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:106)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:208)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:128)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCFindEntitiesCommand.execute(JDBCFindEntitiesCommand.java:40)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.findEntities(JDBCStoreManager.java:598)
at org.jboss.ejb.plugins.CMPPersistenceManager.findEntities(CMPPersistenceManager.java:278)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.findEntities(CachedConnectionInterceptor.java:325)
at org.jboss.ejb.EntityContainer.findLocal(EntityContainer.java:609)
at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.ejb.EntityContainer$ContainerInterceptor.invokeHome(EntityContainer.java:1066)
at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:88)
at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invokeHome(EntitySynchronizationInterceptor.java:204)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invokeHome(CachedConnectionInterceptor.java:215)
at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:88)
at org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:97)
at org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:61)
at org.jboss.ejb.plugins.EntityCreationInterceptor.invokeHome(EntityCreationInterceptor.java:28)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:88)
at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:317)
at org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:130)
at org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:85)
at org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:121)
at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invokeHome(ProxyFactoryFinderInterceptor.java:93)
at org.jboss.ejb.EntityContainer.internalInvokeHome(EntityContainer.java:478)
at org.jboss.ejb.Container.invoke(Container.java:729)
at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invokeHome(BaseLocalProxyFactory.java:347)
at org.jboss.ejb.plugins.local.LocalHomeProxy.invoke(LocalHomeProxy.java:110)
at $Proxy209.findAvailableForLocationSinceTimestamp(Unknown Source)
...
Caused by: javax.resource.ResourceException: Failure to delist resource
at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener.delist(TxConnectionManager.java:478)
at org.jboss.resource.connectionmanager.TxConnectionManager.managedConnectionDisconnected(TxConnectionManager.java:338)
at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:507)
at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:888)
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:102)
... 118 more
And, at last, the FinderException
2005-12-06 10:02:23,737 ERROR [org.jboss.ejb.plugins.LogInterceptor] EJBException in method: public abstract its.model.generated.common.ScannedDocumentPK its.domain.scanneddoc.ScannedDocumentHandlerLocal.startProcessingNext(its.domain.edim.SubQueueFilter) throws its.service.exception.ServiceException,its.domain.edim.DocumentQueueEmptyException,its.service.exception.ITSFinderException, causedBy:
javax.ejb.FinderException: Find failed: org.jboss.util.NestedSQLException: Failure to delist resource; - nested throwable: (javax.resource.ResourceException: Failure to delist resource)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:243)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCAbstractQueryCommand.execute(JDBCAbstractQueryCommand.java:128)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCFindEntitiesCommand.execute(JDBCFindEntitiesCommand.java:40)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.findEntities(JDBCStoreManager.java:598)
at org.jboss.ejb.plugins.CMPPersistenceManager.findEntities(CMPPersistenceManager.java:278)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.findEntities(CachedConnectionInterceptor.java:325)
at org.jboss.ejb.EntityContainer.findLocal(EntityContainer.java:609)
at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.ejb.EntityContainer$ContainerInterceptor.invokeHome(EntityContainer.java:1066)
at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:88)
at org.jboss.ejb.plugins.EntitySynchronizationInterceptor.invokeHome(EntitySynchronizationInterceptor.java:204)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invokeHome(CachedConnectionInterceptor.java:215)
at org.jboss.ejb.plugins.AbstractInterceptor.invokeHome(AbstractInterceptor.java:88)
at org.jboss.ejb.plugins.EntityInstanceInterceptor.invokeHome(EntityInstanceInterceptor.java:97)
at org.jboss.ejb.plugins.EntityLockInterceptor.invokeHome(EntityLockInterceptor.java:61)
at org.jboss.ejb.plugins.EntityCreationInterceptor.invokeHome(EntityCreationInterceptor.java:28)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:88)
at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:317)
at org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:130)
at org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:85)
at org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:121)
at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invokeHome(ProxyFactoryFinderInterceptor.java:93)
at org.jboss.ejb.EntityContainer.internalInvokeHome(EntityContainer.java:478)
at org.jboss.ejb.Container.invoke(Container.java:729)
at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invokeHome(BaseLocalProxyFactory.java:347)
at org.jboss.ejb.plugins.local.LocalHomeProxy.invoke(LocalHomeProxy.java:110)
at $Proxy209.findAvailableForLocationSinceTimestamp(Unknown Source)