David...
Any idea how this will be handled in EJB 3 beans when the
transaction attributes are defined in the annotations? If I were
to define a transaction annotation for the whole bean and
another for an individual method, would the method level
attribute be ignored?
Chris
On 8/1/07, David Blevins <[EMAIL PROTECTED]> wrote: On Jul
25, 2007, at 7:57 PM, Christopher Blythe wrote:
> I was working on DayTrader 2.0 when I found that the resetTrade
> method for all of the runtime modes (with the exception of Direct
> mode) would fail. I went back and deploy DayTrader 1.2 on GMO 2.0
> and noticed the same behavior. I then went back and deploy DT 1.2
> on GMO 1.1.1 and resetTrade worked for EJB mode like a champ.
>
> If you look in the ejb-jar.xml and check out the container
> transactions, you see the following...
>
> <container-transaction>
> <method>
> <ejb-name>TradeEJB</ejb-name>
> <method-intf>Remote</method-intf>
> <method-name>resetTrade</method-name>
> <method-params>
> <method-param>boolean</method-param>
> </method-params>
> </method>
> ...
> <trans-attribute>NotSupported</trans-attribute>
> </container-transaction>
>
> <container-transaction>
> ...
> <method>
> <ejb-name>TradeEJB</ejb-name>
> <method-name>*</method-name>
> </method>
> ...
> <trans-attribute>Required</trans-attribute>
> </container-transaction>
Took me a couple hours to dig through this but basically what is
happening is that the second transaction attribute declaration for
TradeEJB (method "*") is essentially overwriting the first (method
"resetTrade(boolean)). These are processed in the order they are
declared so fixing it should be as easy as moving the "resetTrade
(boolean)" declaration to be after the "*" declaration.
If you know of a part of the EJB spec that is relevant I'm
definitely
all ears -- as far as I know it's valid to process them in the
order
they are declared.
For the future (not 2.0) and provided it isn't explicitly
prohibited
by the spec, we could possibly order the container-transaction
declarations for an ejb from least specific to most specific and
process them that way -- like we do for interceptor-bindings.
If you
had some time to do some leg work on digging through the spec
that'd
be great.
-David
> The impl for resetTrade in the TradeEJB session bean calls to the
> TradeDirect code in order to perform the reset. The TradeDirect
> code manages the transaction commits on its own. That is why the
> resetTrade method in TradeEJB was marked as NotSupported.
>
> As I mentioned earlier, this was recognized by the Geronimo 1.1.1
> container; however, it looks like the Geronimo 2.0 container
is not
> picking this up.
>
> A look at some of the OpenEJB trace information seems to confirm
> this...
>
> 22:11:51,437 INFO [OpenEJB] invoking method resetTrade on ejb/
> TradeEJB with identity null
> 22:11:51,437 INFO [Transaction] TX Required: Started transaction
> [EMAIL PROTECTED]
> 22:11:51,437 TRACE [SinglePoolConnectionInterceptor] Supplying
> pooled connection MCI:
>
[EMAIL PROTECTED]
3e
> MC: [EMAIL PROTECTED] from
> pool:
>
org.apache.geronimo.connector.outbound.SinglePoolConnectionIntercep
tor
> @56525652
> 22:11:51,437 TRACE [TransactionCachingInterceptor] supplying
> connection from pool null for managed connection
> [EMAIL PROTECTED] to tx
> caching interceptor
>
org.apache.geronimo.connector.outbound.TransactionCachingIntercepto
[EMAIL PROTECTED]
> c005c00
> 22:11:51,546 ERROR [Log] Error: Failed to reset Trade
>
> Just for reference, here is the exception that is being
thrown....
>
> 22:51:04,031 ERROR [Log] Error: Failed to reset Trade
>
> com.ibm.db2.jcc.b.SqlException: setAutoCommit(true)
invalid
> during global transaction
> com.ibm.db2.jcc.b.SqlException : setAutoCommit(true) invalid
during
> global transaction
> at com.ibm.db2.jcc.b.p.setAutoCommit(p.java:1152)
> at com.ibm.db2.jcc.b.dc.setAutoCommit(dc.java:151)
> at
>
org.tranql.connector.jdbc.ManagedXAConnection.localTransactionCommi
t
> (ManagedXAConnection.java :104)
> at org.tranql.connector.AbstractManagedConnection
> $LocalTransactionImpl.commit(AbstractManagedConnection.java :192)
> at org.tranql.connector.jdbc.ConnectionHandle.commit
> (ConnectionHandle.java:115)
> at
> org.apache.geronimo.samples.daytrader.direct.TradeDirect.commit
> (TradeDirect.java :2044)
> at
>
org.apache.geronimo.samples.daytrader.direct.TradeDirect.resetTrade
> (TradeDirect.java:1964)
> at
> org.apache.geronimo.samples.daytrader.ejb.TradeBean.resetTrade
> (TradeBean.java:931)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java :64)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:615)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext
> $Invocation.invoke (ReflectionInvocationContext.java:146)
> at
>
org.apache.openejb.core.interceptor.ReflectionInvocationContext.pro
cee
> d(ReflectionInvocationContext.java:129)
> at
> org.apache.openejb.core.interceptor.InterceptorStack.invoke
> (InterceptorStack.java:67)
> at
> org.apache.openejb.core.stateless.StatelessContainer._invoke
> (StatelessContainer.java :203)
> at
> org.apache.openejb.core.stateless.StatelessContainer.invoke
> (StatelessContainer.java :165)
> ...
>
> Anyone have any thoughts on this one?
>
> Chris
>
> --
> "I say never be complete, I say stop being perfect, I say let...
> lets evolve, let the chips fall where they may." - Tyler Durden
--
"I say never be complete, I say stop being perfect, I say let...
lets evolve, let the chips fall where they may." - Tyler Durden