2016-10-30 4 views
1

私のような春のウサギの消費者を持っています。私はそれをチェックし、私は3つのテーブルにデータを保存し、例外をスローしてから4番目のテーブルに保存します。また、3つのpreviosテーブルのデータはロールバックされません。どのように春にそれを正しく行うには? onMessageメソッド内のすべてのコードをトランザクション内に置いておきたい。おかげ春ウサギと春の取引は

がUPDATE 私のウサギのconf:あなたのトランザクションマネージャが正しくお使いのデータベースに設定されている場合は

@Configuration @ComponentScan(basePackages = {"com.mycompany"}) 
public class TicketModeRabbit { 
    @Bean TicketModeConsumer ticketModeConsumer() { 
     return new TicketModeConsumer(); 
    } 

    @Bean(name = TicketModeRabbitData.QUEUE_BEAN_NAME) Queue queue() { 
     return new Queue(TicketModeRabbitData.QUEUE_BEAN_NAME); 
    } 


    @Bean(name = TicketModeRabbitData.QUEUE_BINDING_NAME) Binding binding(
      @Qualifier(TicketModeRabbitData.QUEUE_BEAN_NAME) Queue q, TopicExchange e) { 
     return BindingBuilder.bind(q).to(e).with(TicketModeRabbitData.QUEUE_TOKEN_NAME); 
    } 

    @Bean(name = TicketModeRabbitData.CONTAINER_NAME) 
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, 
      @Qualifier(TicketModeRabbitData.LISTENER_ADAPTED_NAME) 
        MessageListenerAdapter listenerAdapter) { 
     return WorkerConfigHelper 
       .rabbitConfigListenerContainer(connectionFactory, listenerAdapter, 
         TicketModeRabbitData.QUEUE_BEAN_NAME, 
         WorkerConfigHelper.GLOBAL_CONCURRENT_CONSUMERS); 
    } 

    @Bean(name = TicketModeRabbitData.LISTENER_ADAPTED_NAME) 
    MessageListenerAdapter listenerAdapter() { 
     return new MessageListenerAdapter(ticketModeConsumer()); 
    } 
} 

答えて

2

、あなたがする必要がある唯一のものはonMessage法上の@Transactionaリットルアノテーションを追加しています。コンシューマ(MessageListener)はSpringコンテナによって管理されるBeanである必要があります。

@Override 
@Transactional 
public void onMessage(Message amqpMessage, Channel channel) 
      throws Exception { 
    //..some code goes here - I want it to be in spring transaction 
} 
+0

ありがとうございますが、ウサギの消費者向けに春のサポートを設定する方法はありますか? Thanks – avalon

+0

ListenerContainerでMessageListenerをどのようにセットアップしましたか?あなたの春の設定を追加できますか? –

+0

ありがとう、私はちょうど私のinitilalポストにそれを追加しました。 – avalon

関連する問題