Transaction timeout and MDB message loss
p.t. Mar 14, 2012 8:10 AMHi everyone,
I'm porting a J2EE application, that define MDB's and SSB's, to JBoss 5.1
Application connects to PostgresSQL and ActiveMQ (5.4.2 and 5.5.1), using a tow phase commit and a Container managed transaction.
for activemq we followed best pratices stated in the issue: https://issues.apache.org/jira/browse/AMQ-2670
What we've found blocking is a strange behaviour when MDB's goes in transaction timeout: activemq lose the message, eventhough transaction is rollbacked.
I've found a JBOSS https://issues.jboss.org/browse/JBAS-7922 about message loss, but the test case is quite different.
Has someone faced something similar? There are some configuration change that could be applied?
Resource configuration.
<datasources>
<xa-datasource>
<jndi-name>jdbc/fmbDSwfm</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<xa-datasource-property name="ServerName">127.0.0.1</xa-datasource-property>
<xa-datasource-property name="PortNumber">5432</xa-datasource-property>
<xa-datasource-property name="DatabaseName">svi_mm_jboss2</xa-datasource-property>
<xa-datasource-property name="User">svi_mm_jboss2_user</xa-datasource-property>
<xa-datasource-property name="Password">svi_mm_jboss2_user</xa-datasource-property>
<!-- <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> -->
<xa-datasource-class>org.postgresql.xa.PostgreSqlXaDataSource</xa-datasource-class>
<idle-timeout-minutes>90</idle-timeout-minutes>
<xa-resource-timeout>91</xa-resource-timeout>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter>
</validation>
<metadata>
<type-mapping>PostgreSQL 7.2</type-mapping>
</metadata>
<min-pool-size>0</min-pool-size>
<max-pool-size>30</max-pool-size>
</xa-datasource>
</datasources>
<mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=ActiveMQJMSProvider">
<attribute name="ProviderName">ActiveMQRAR</attribute>
<attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
<attribute name="Properties">xa=true
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://127.0.0.1:62000
</attribute>
<attribute name="QueueFactoryRef">java:/activemq/XAConnectionFactory</attribute>
<attribute name="TopicFactoryRef">java:/activemq/XAConnectionFactory</attribute>
<attribute name="FactoryRef">java:/activemq/XAConnectionFactory</attribute>
</mbean>
<tx-connection-factory>
<jndi-name>jms/fmbQCF</jndi-name>
<xa-transaction/>
<rar-name>activemq-rar-5.5.1.rar</rar-name>
<connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition>
<config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/ActiveMQRAR</config-property>
<min-pool-size>1</min-pool-size>
<max-pool-size>85</max-pool-size>
<blocking-timeout-millis>30000</blocking-timeout-millis>
<idle-timeout-minutes>3</idle-timeout-minutes>
</tx-connection-factory>
<?xml version="1.0" encoding="UTF-8"?>
<transaction-service>
<properties name="documentation">
<!--
Properties necessarie alla configurazione XA activeMQ + PostgreSQL
-->
</properties>
<properties depends="arjuna" name="jta">
<!--
Support subtransactions in the JTA layer?
Default is NO.
-->
<property name="com.arjuna.ats.jta.supportSubtransactions" value="NO"/>
<property name="com.arjuna.ats.jta.jtaTMImplementation" value="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/>
<!--
com.arjuna.ats.internal.jta.transaction.jts.TransactionManagerImple
-->
<property name="com.arjuna.ats.jta.jtaUTImplementation" value="com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple"/>
<!--
com.arjuna.ats.internal.jta.transaction.jts.UserTransactionImple
-->
<!-- xaRecoveryNode should match value in nodeIdentifier or be * -->
<property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/>
<!-- *** Add this line to enable recovery for JMS resources using ACTIVEMQ *** -->
<!--<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ACTIVEMQ" value="org.jboss.jms.server.recovery.MessagingXAResourceRecovery;java:/ActiveMQJMSProvider"/>-->
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ACTIVEMQ" value="org.jboss.jms.server.recovery.MessagingXAResourceRecovery;jms/fmbQCF"/>
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.JDBC" value="com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;jdbc/fmbDSwfm"/>
</properties>
</transaction-service>