Okay, I'll check it out. I'm on the road today so it will
probably be tomorrow. I think the only illegalargumentexception I added
was when you try to remove an event listener from an XAConnection and
there was no listener there... As I said, I'll look into it.
Aaron
On Thu, 26 Oct 2000, Oleg Nitz wrote:
> Hi Aaron,
>
> After the latest changes I sometimes get exceptions on transaction
> commit(), like this:
>
> java.lang.IllegalArgumentException
> at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:72)
> at
>org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:418)
> at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:99)
> at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
> at
>org.jboss.ejb.StatefulSessionContainer.invoke(StatefulSessionContainer.java:326)
> at
>org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invoke(JRMPContainerInvoker.java:163)
> at java.lang.reflect.Method.invoke(Native Method)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:241)
> at sun.rmi.transport.Transport$1.run(Transport.java:142)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:139)
> at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:443)
> at
>sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:643)
> at java.lang.Thread.run(Thread.java:484)
>
> And on the next commit():
>
> TRANSACTION ROLLBACK EXCEPTION:Application Error: tried to enter Stateful bean with
>different transaction context; nested exception is:
> java.rmi.RemoteException: Application Error: tried to enter Stateful bean with
>different transaction context
> java.rmi.RemoteException: Application Error: tried to enter Stateful bean with
>different transaction context Best regards,
> at
>org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor.invoke(StatefulSessionInstanceInterceptor.java:148)
> Oleg
> at org.jboss.ejb.plugins.TxInterceptorCMT.invokeNext(TxInterceptorCMT.java:133)
> at
>org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:378)
> at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:99)
> jBoss CVS Development wrote:
> at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:192)
> jCD> User: mulder
> at
>org.jboss.ejb.StatefulSessionContainer.invoke(StatefulSessionContainer.java:326)
> jCD> Date: 00/10/25 16:54:37
> at
>org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker.invoke(JRMPContainerInvoker.java:163)
> at java.lang.reflect.Method.invoke(Native Method)
> jCD> Modified:
>src/main/org/jboss/minerva/factories
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:241)
> jCD>
>XAConnectionFactory.java
> at sun.rmi.transport.Transport$1.run(Transport.java:142)
> jCD> Log:
> at java.security.AccessController.doPrivileged(Native Method)
> jCD> More compliant with JDBC 2
>Optional Package spec.
> at sun.rmi.transport.Transport.serviceCall(Transport.java:139)
> jCD> - Don't de-register a
>connection from transaction in case of error
> at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:443)
> jCD> - Don't allow commit,
>rollback, or setAutoCommit(true) if registered
> at
>sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:643)
> jCD> with transaction
> at java.lang.Thread.run(Thread.java:484)
>
> I traced the first exception until the line 129 of
> XAConnectionFactory.java:
> transListener = new TransactionListener() {
> public void transactionFinished(XAConnectionImpl con) {
> here: con.removeConnectionEventListener(errorListener);
> the IllegalArgumentException is thrown because errorListener is not
> found in the list of listeners.
>
> Certainly, it is possible that something is wrong in Castor-jBoss
> integration (all there exception appeared when I worked through
> Castor).
> Could you give me a tip, what might be done wrong, what error could
> cause the exception.
>
> Regards,
> Oleg
>
>
>
> jCD> Also try to avoid a sporadic problem in load test where it tries to
> jCD> deregister a connection from the transaction but it has no record
> jCD> of a resource for the connection. I think this is a threading issue
> jCD> where somehow the event is triggered again before the listener is
> jCD> removed, though that's only a guess. Unfortunately I've only seen
> jCD> the problem twice in about 50 5-minute runs, so it's pretty hard
> jCD> to test for.
>
> jCD> Revision Changes Path
> jCD> 1.11 +8 -4
>jboss/src/main/org/jboss/minerva/factories/XAConnectionFactory.java
>
> jCD> Index: XAConnectionFactory.java
> jCD> ===================================================================
> jCD> RCS file:
>/products/cvs/ejboss/jboss/src/main/org/jboss/minerva/factories/XAConnectionFactory.java,v
> jCD> retrieving revision 1.10
> jCD> retrieving revision 1.11
> jCD> diff -u -r1.10 -r1.11
> jCD> --- XAConnectionFactory.java 2000/10/21 05:20:22 1.10
> jCD> +++ XAConnectionFactory.java 2000/10/25 23:54:37 1.11
> jCD> @@ -39,7 +39,7 @@
> jCD> * connection, the same previous connection will be returned. Otherwise,
> jCD> * you won't be able to share changes across connections like you can with
> jCD> * the native JDBC 2 Standard Extension implementations.</P>
> jCD> - * @version $Revision: 1.10 $
> jCD> + * @version $Revision: 1.11 $
> jCD> * @author Aaron Mulder ([EMAIL PROTECTED])
> jCD> */
> jCD> public class XAConnectionFactory extends PoolObjectFactory {
> jCD> @@ -78,7 +78,7 @@
> jCD> if(pool.isInvalidateOnError()) {
> jCD> pool.markObjectAsInvalid(evt.getSource());
> jCD> }
> jCD> - closeConnection(evt, XAResource.TMFAIL);
> jCD> +// closeConnection(evt, XAResource.TMFAIL);
> jCD> }
>
> jCD> public void connectionClosed(ConnectionEvent evt) {
> jCD> @@ -87,11 +87,16 @@
>
> jCD> private void closeConnection(ConnectionEvent evt, int status) {
> jCD> XAConnection con = (XAConnection)evt.getSource();
> jCD> + try {
> jCD> + con.removeConnectionEventListener(listener);
> jCD> + } catch(IllegalArgumentException e) {
> jCD> + return; // Removed twice somehow?
> jCD> + }
> jCD> Transaction trans = null;
> jCD> try {
> jCD> if(tm.getStatus() != Status.STATUS_NO_TRANSACTION) {
> jCD> trans = tm.getTransaction();
> jCD> - XAResource res =
>(XAResource)rms.get(con);//con.getXAResource();
> jCD> + XAResource res = (XAResource)rms.get(con);
> jCD> trans.delistResource(res, status);
> jCD> rms.remove(con);
> jCD> }
> jCD> @@ -99,7 +104,6 @@
> jCD> Logger.exception(e);
> jCD> throw new RuntimeException("Unable to deregister with
>TransactionManager: "+e);
> jCD> }
> jCD> - con.removeConnectionEventListener(listener);
>
> jCD> if(!(con instanceof XAConnectionImpl)) {
> jCD> // Real XAConnection -> not associated w/ transaction
>
>
>