Search code examples
transactionsjbossseamjta

Transaction synchornization registration problem


For our web application built with Seam with have a bunch of server test cases. These run on multiple systems (Mac OS X and Linux); normally, you can clone the repository and run the test cases without any problem.

However, the test cases do not run on the laptop of one person in our team. He uses Fedora Core on a Lenovo Laptop. We encounter the following exception when the application is deployed to the embedded JBoss that Seam uses for Unit/Integration testing:

javax.persistence.PersistenceException:
org.hibernate.TransactionException: Could not register synchronization
   at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
   at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:547)
   at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:82)
   at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:61)
   at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:39)
   at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:34)
   at org.jboss.ejb3.entity.InjectedEntityManagerFactory.createEntityManager(InjectedEntityManagerFactory.java:78)
   at org.jboss.seam.persistence.ManagedPersistenceContext.initEntityManager(ManagedPersistenceContext.java:79)
   at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManager(ManagedPersistenceContext.java:108)
   at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
   at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
   at org.jboss.seam.Component.callComponentMethod(Component.java:2275)
   at org.jboss.seam.Component.unwrap(Component.java:2301)
   at org.jboss.seam.Component.getInstance(Component.java:2044)
   at org.jboss.seam.Component.getInstance(Component.java:1986)
   at org.jboss.seam.Component.getInstance(Component.java:1980)
   at org.jboss.seam.Component.getInstanceInAllNamespaces(Component.java:2375)
   at org.jboss.seam.Component.getValueToInject(Component.java:2327)
   at org.jboss.seam.Component.injectAttributes(Component.java:1739)
   at org.jboss.seam.Component.inject(Component.java:1557)
   at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:61)
   at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
   at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:97)
   at org.jboss.seam.util.Work.workInTransaction(Work.java:61)
   at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:91)
   at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
   at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
   at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
   at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
   at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185)
   at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103)
   at com.ambitz.everest.bootstrap.EverestBootstrap_$$_javassist_seam_9.initializeEverest(EverestBootstrap_$$_javassist_seam_9.java)
   at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
   at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
   at org.jboss.seam.Component.callComponentMethod(Component.java:2275)
   at org.jboss.seam.core.Events.raiseEvent(Events.java:85)
   at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:145)
   at org.jboss.seam.init.Initialization.init(Initialization.java:747)
   at org.jboss.seam.mock.AbstractSeamTest.startSeam(AbstractSeamTest.java:919)
   at com.ambitz.everest.test.JUnitSeamTest.startContainer(JUnitSeamTest.java:65)
   at com.ambitz.everest.test.EverestServerTestSuite.setUpBeforeClass(EverestServerTestSuite.java:47)
Caused by: org.hibernate.TransactionException: Could not register synchronization
   at org.hibernate.transaction.CMTTransaction.registerSynchronization(CMTTransaction.java:213)
   at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:470)
Caused by: java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.syncsnotallowed] [com.arjuna.ats.internal.jta.transaction.arjunacore.syncsnotallowed] Synchronizations are not allowed!
   at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.registerSynchronizationImple(TransactionImple.java:473)
   at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.registerSynchronization(TransactionImple.java:441)
   at org.hibernate.transaction.CMTTransaction.registerSynchronization(CMTTransaction.java:210)

The test environment uses HSQLDB 2.1.0.

As I already said, the test cases run smoothly on other Linux machines (also with Fedora Core). Does anybody know, what might influence the CMTTransaction so that on this particular machine the transaction synchronization registration is not allowed?


Solution

  • In the meantime we found the problem and the solution: The problem was that arjuna was not able to resolve the host name of the machine and therefore was not able to create UIDs for the transactions. Interestingly, this information was only logged with WARN severity but had influence on the transaction synchronization.

    The solution: we added the host name of the machine into /etc/hosts for 127.0.0.1.