2016-07-15 18 views
0

Ich breche meinen Kopf gegen die Wand, da ich keine Ahnung habe, warum die Transaktionen nicht zurückrollen.JMS-Message-Driven-Channel Adaper Rollback nicht die Transaktion

Ich bin mit Feder Integration in meinem Projekt und meine applicationContext.xml sieht aus wie folgt:

<context:component-scan base-package="com.jms.spring.integration.*"></context:component-scan> 

<tx:annotation-driven/> 

<int:poller default="true" id="poller" fixed-delay="500"></int:poller> 

<int-jms:message-driven-channel-adapter 
    channel="processEmpChannel" destination-name="com.test.inputqueue" acknowledge="transacted" connection-factory="targetConnectionFactory"/> 

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:61616"></property> 
</bean> 
<bean id="springExample" class="com.jms.spring.integration.SpringIntegrationJmsExample"> 
</bean> 

<int:service-activator input-channel="processEmpChannel" 
    ref="springExample" method="handleClient"> 
    <int:poller ref="poller"></int:poller> 
</int:service-activator> 

Meine Java-Datei wie folgt aussieht:

package com.jms.spring.integration; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.transaction.annotation.Transactional; 

public class SpringIntegrationJmsExample { 
    @Transactional 
    public void handleClient(String str){ 
     System.out.println("handleClient"); 
     throw new RuntimeException("Throwing some runtime exception...."); 
    } 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    } 
} 

Als ich die Nachricht in der Warteschlange zu veröffentlichen, ich Sehen Sie die Ausnahme, aber die Nachricht in der Warteschlange wird verbraucht. Die Transaktion wird nicht zurückgesetzt und die Nachricht wird nicht in die Warteschlange gestellt. Bitte lassen Sie mich wissen, wo ich falsch liege.

Antwort

1

Weil processEmpChannel ein QueueChannel ist; Die Transaktion wird festgeschrieben, sobald die Nachricht in die Kanalwarteschlange eingereiht wird (bevor sie vom Dienst verarbeitet wird).

Sie müssen DirectChannel s verwenden, damit Transaktionen wie erwartet funktionieren, sodass der Serviceaktivator für den Thread des Listener-Containers ausgeführt wird (entfernen Sie den Poller).

Siehe Message Channels und Transaction Support.

+0

Danke. Das hat wie ein Zauber funktioniert. Der AMQ versucht jedoch, 8 Mal zu liefern, und dann wird die Nachricht verbraucht. Wie konfiguriere ich, um die Nachricht, die auch nach 8 Versuchen fehlgeschlagen ist, in eine Warteschlange zu setzen? – zilcuanu

+1

Das ist auf dem Broker konfiguriert; es ist nicht Teil der JMS-Spezifikation; Durchsuchen Sie die AMQ-Dokumente. –