[
https://issues.jboss.org/browse/AS7-5888?page=com.atlassian.jira.plugin.s...
]
Kamesh Marellapudi updated AS7-5888:
------------------------------------
Priority: Blocker (was: Major)
Errors accessing CMR from ejbStore of the CMP EntityBean (EJB 2.1
spec)
-----------------------------------------------------------------------
Key: AS7-5888
URL:
https://issues.jboss.org/browse/AS7-5888
Project: Application Server 7
Issue Type: Bug
Affects Versions: 7.1.1.Final
Environment: Windows
Reporter: Kamesh Marellapudi
Priority: Blocker
Labels: jboss
Background :: We are trying to upgrade our app from JBoss 4.0.1Sp3 to Jboss 7.1.1-Final.
We have a lot of entity beans based on EJB 2.1 spec. We are noticing the following when we
run our application on Jboss 7.1.1-Final. We did NOT have these issues on Jboss 4.0.1.
Issue :: : ARJUNA016082: Synchronizations are not allowed! Transaction status
isActionStatus.RUNNING
What I found?
1. In our application we access CMRs of an entity bean from the ejbStore of the same
entity bean.
2. ejbStore is invoked from the beforeCompletion of
EntityBeanSynchronizationInterceptor$EntityBeanSynchronization.
3. During the invocation of CMR on the entity bean the call gets delegated to
JDBCCMRFieldBridge.getrelationSet(). In this method we have
the following
try {
// get the current transaction
CmpEntityBeanComponent component = getJDBCStoreManager().getComponent();
TransactionManager tm = component.getTransactionManager();
Transaction tx = tm.getTransaction();
// if whe have a valid transaction...
if (tx != null && (tx.getStatus() == Status.STATUS_ACTIVE ||
tx.getStatus() == Status.STATUS_PREPARING)) {
// crete the relation set and register for a tx callback
relationSet = new RelationSet(JDBCCMRFieldBridge.this, ctx,
setHandle, false);
TxSynchronization sync = new TxSynchronization(FieldState.this);
tx.registerSynchronization(sync);
} else {
// if there is no transaction create a pre-failed list
relationSet = new RelationSet(JDBCCMRFieldBridge.this, ctx, new
List[1], false);
}
return relationSet;
} catch (SystemException e) {
throw MESSAGES.errorCreatingRelationSet(e);
} catch (RollbackException e) {
throw MESSAGES.errorCreatingRelationSet(e);
}
So we are trying to register TxSynchronization from beforeCompletion of
EntityBeanSynchronization.
4. Now in the TwoPhaseCoordinator.addSynchronization method we have the following piece
of code
// disallow addition of Synchronizations that would appear
// earlier in sequence than any that has already been called
// during the pre-commmit phase. This generic support is required for
// JTA Synchronization ordering behaviour
if(sr instanceof Comparable && _currentRecord != null) {
Comparable c = (Comparable)sr;
if(c.compareTo(_currentRecord) != 1) {
return AddOutcome.AR_REJECTED;
}
}
and the SynchronizationImple.compareTo has the following
public int compareTo(Object object)
{
SynchronizationImple other = (SynchronizationImple)object;
if(this._isInterposed && (!other._isInterposed))
{
return 1;
}
else if((!this._isInterposed) && other._isInterposed)
{
return -1;
}
else if(this._theUid.equals(other._theUid))
{
return 0;
}
else
{
return this._theUid.lessThan(other._theUid) ? -1 : 1;
}
}
So basically what I understood is the TxSynchronization registration from ejbStore is a
bit too late because we are already in the beforeCompletion of one of the synchronizations
listed in the transaction unless its registered through
TransactionSynchronizationRegistry.registerInterposedSynchronization.
Here is the full stacktrace
Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit
transaction.
at
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1177)
[jbossjts-4.16.2.Final.jar:]
at
com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:117)
[jbossjts-4.16.2.Final.jar:]
at
com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
at
org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.afterDelivery(MessageEndpointInvocationHandler.java:72)
... 16 more
Caused by: javax.ejb.EJBException: javax.ejb.TransactionRolledbackLocalException:
ARJUNA016082: Synchronizations are not allowed! Transaction status isActionStatus.RUNNING
at
org.jboss.as.cmp.component.CmpEntityBeanComponentInstance.store(CmpEntityBeanComponentInstance.java:108)
at
org.jboss.as.ejb3.component.entity.interceptors.EntityBeanSynchronizationInterceptor$EntityBeanSynchronization.beforeCompletion(EntityBeanSynchronizationInterceptor.java:185)
at
com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
[jbossjts-4.16.2.Final.jar:]
at
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273)
[jbossjts-4.16.2.Final.jar:]
at
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93)
[jbossjts-4.16.2.Final.jar:]
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:164)
[jbossjts-4.16.2.Final.jar:]
at
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165)
[jbossjts-4.16.2.Final.jar:]
... 19 more
Caused by: javax.ejb.TransactionRolledbackLocalException: ARJUNA016082: Synchronizations
are not allowed! Transaction status isActionStatus.RUNNING
at
org.jboss.as.ejb3.component.interceptors.EjbExceptionTransformingInterceptorFactories$2.processInvocation(EjbExceptionTransformingInterceptorFactories.java:93)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165)
at
org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.as.ejb3.component.entity.interceptors.EntityBeanPrimaryKeyInterceptor.processInvocation(EntityBeanPrimaryKeyInterceptor.java:52)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at
org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72)
at
com.taliantsoftware.policy.payrollreport.ejb.PayrollReportLocal$$$view1774.getPremiumPeriodCMR(Unknown
Source)
at
com.taliantsoftware.policy.payrollreport.ejb.PayrollReportBean.getContextRootId(PayrollReportBean.java:491)
at
insureworx.ejbservices.history.ejb.JDBCHistoryHandler.createActivityDetail(JDBCHistoryHandler.java:628)
at
insureworx.ejbservices.history.ejb.JDBCHistoryHandler.createActivity(JDBCHistoryHandler.java:430)
at
insureworx.ejbservices.history.ejb.JDBCHistoryHandler.expireOldHistoryAndCreateNewHistory(JDBCHistoryHandler.java:390)
at
insureworx.ejbservices.history.ejb.HistoryCapableJDBCEntityBean.expireOldHistoryAndCreateNewHistory(HistoryCapableJDBCEntityBean.java:67)
at
insureworx.ejbservices.history.ejb.HistoryCapableJDBCEntityBean.registerForHistory(HistoryCapableJDBCEntityBean.java:253)
at
insureworx.ejbservices.history.ejb.HistoryCapableJDBCEntityBean.ejbStore(HistoryCapableJDBCEntityBean.java:159)
at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source) [:1.7.0_09]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[rt.jar:1.7.0_09]
at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_09]
at
org.jboss.as.ejb3.component.InvokeMethodOnTargetInterceptor.processInvocation(InvokeMethodOnTargetInterceptor.java:57)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
at
org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at
org.jboss.as.ejb3.component.entity.EntityBeanComponentInstance.invokeEjbStore(EntityBeanComponentInstance.java:163)
at
org.jboss.as.cmp.component.CmpEntityBeanComponentInstance.store(CmpEntityBeanComponentInstance.java:97)
... 25 more
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira