08 Eylül 2011

JBOSS 6'da "Adding multiple last resources is disallowed" hatası

EJB'nizde bir transaction içerisinde birden fazla JPA entity manager kullanarak işlemlerinizi gerçekleştirmek istediniz. JBOSS 6 kullanıyorum. Hiç bir ayar yapmadan bunu denediğinizde aşağıdaki gibi bir hata alabilirsiniz:

ARJUNA-12140 Adding multiple last resources is disallowed.
...
Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0acc0a36:12ce:4e6754eb:142 status: ActionStatus.ABORT_ONLY >); - nested throwable: (org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object!; - nested throwable: (javax.transaction.SystemException: java.lang.Throwable: Unabled to enlist resource, see the previous warnings. tx=TransactionImple < ac, BasicAction: 0:ffff0acc0a36:12ce:4e6754eb:142 status: ActionStatus.ABORT_ONLY >))



JBOSS 6'da varsayılan ayarlar olarak bir transaction'da tek datasource kullanabiliyorsunuz. Bu nedenle two phase commit gereken işlemleri yapamıyorsunuz. Bunu yapabilmek için deploy dizini altındaki transaction-jboss-beans.xml dosyasını açınız ve aşağıdaki değişikliği yapınız.


<bean name="CoreEnvironmentBean" class="com.arjuna.ats.arjuna.common.CoreEnvironmentBean">
  ...
     <property name="allowMultipleLastResources">true</property>  
  ...
</bean>

Bunu yapınca uygulamanızı çalıştırdığınızda konsolde aşağıdaki bir warning alabilirsiniz:


WARN  [com.arjuna.ats.arjuna] ARJUNA-12141 Multiple last resources have been added to the current transaction. This is transactionally unsafe and should not be relied upon. Current resource is com.arjuna.ats.internal.arjuna.abstractrecords.LastResourceRecord@63a188

Bunun nedeni jboss datasource xml'inizde kullandığınız datasource tipi local datasource olmasıdır. Bunun yerine two phase commit imkanı sağlayan xa datasource kullanınız.