Question

J'utilise Activemq comme serveur JMS et Atomikos en tant que gestionnaire de transactions.

sur l'interface Web de l'administrateur ActivEMQ Je vois que un message a été en cours, mais 2 (!) Les messages ont été désactivés.

Toutefois, le message JMS Consumer Process Message une seule fois, il n'y a pas de duplication dans le traitement.Lorsque j'utilise Simple Spring Spring JMStransActionManager, il y en a un en profondeur et un déséquilibre.Le problème n'apparaît que pour Atomikos JTA Transaction Manager.

Quel est le problème?Comment configurer Atomikos pour ne pas voir deux fois des messages de résolution?

Ma configuration est ci-dessous.Il est presque le même que dans le tutoriel.BTW, l'exemple d'intégration de printemps d'Atomikos fonctionne bien, mais il utilise le printemps 2.0 alors que j'utilise le printemps 3.1.

<bean id="activeMqXaConnectionFactory" class="org.apache.activemq.spring.ActiveMQXAConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616"/>
</bean>

<bean id="atomikosQueueConnectionFactory" class="com.atomikos.jms.QueueConnectionFactoryBean" init-method="init">
    <property name="resourceName" value="xaMq"/>
    <property name="xaQueueConnectionFactory" ref="activeMqXaConnectionFactory"/>
</bean>

<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
    <property name="targetConnectionFactory" ref="atomikosQueueConnectionFactory"/>
</bean>

<bean id="jmsDefaultContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="singleConnectionFactory"/>
    <property name="messageListener" ref="consumer"/>
    <property name="concurrentConsumers" value="1"/>
    <property name="destinationName" value="q.jtaxa"/>
    <property name="receiveTimeout" value="3000"/>
    <property name="recoveryInterval" value="5000"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="sessionTransacted" value="true"/>
</bean>

<!-- Transactions -->
<!--Construct Atomikos UserTransactionManager, needed to configure Spring-->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
      destroy-method="close">
    <!--  when close is called, should we force transactions to terminate or not? -->
    <property name="forceShutdown" value="true"/>
</bean>

<!-- Also use Atomikos UserTransactionImp, needed to configure Spring  -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout" value="300"/>
</bean>

<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="atomikosTransactionManager"/>
    <property name="userTransaction" ref="atomikosUserTransaction"/>
    <property name="nestedTransactionAllowed" value="true"/>
</bean>

La classe de consommation est:

@Component
public class Consumer implements MessageListener {
  @Override
  public void onMessage(Message message) {
    if (message instanceof TextMessage) {
        try {
            TextMessage textMsg = (TextMessage) message;
            System.out.println("         " + textMsg.getText());
        } catch (JMSException ex) {
            ex.printStackTrace();
        }
    }
  }
}

Était-ce utile?

La solution

J'ai trouvé ce qui a été configuré à tort.C'était "atomikosqueueconnectionfactory".J'ai accueilli au didacticiel, mais cela ne devrait s'agir simplement de la classe AtomikosConnectionFactorybean non de la QueueConnectionFactorybean. J'ai supprimé AtomikosQueconnectionFactory et ajouté AtomikosConnectionfactory

<bean id="atomikosConnectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean" init-method="init">
    <property name="uniqueResourceName" value="amq1"/>
    <property name="xaConnectionFactory" ref="mqXaConnectionFactory"/>
</bean>

Cela fonctionne bien après cela. J'ai trouvé une configuration appropriée ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top