Java SpringRabbit和SpringTransactions

Java SpringRabbit和SpringTransactions,java,spring,rabbitmq,spring-rabbit,Java,Spring,Rabbitmq,Spring Rabbit,我有一个像春兔一样的消费者: @Override public void onMessage(Message amqpMessage, Channel channel) throws Exception { //..some code goes here - I want it to be in spring transaction } 问题是onMessage方法中的代码不在事务下。我检查了它,我将数据保存到3个表中,然后抛出异常,然后保存到第4个表中。来自3个pre

我有一个像春兔一样的消费者:

@Override public void onMessage(Message amqpMessage, Channel channel)
            throws Exception {
//..some code goes here - I want it to be in spring transaction
}
问题是onMessage方法中的代码不在事务下。我检查了它,我将数据保存到3个表中,然后抛出异常,然后保存到第4个表中。来自3个previos表的数据不会回滚。如何在春天正确地做到这一点?我希望onMessage方法中的所有代码都在事务中。谢谢

更新 我的兔子形态:

@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());
    }
}

如果为数据库正确设置了事务管理器,则只需在
onMessage
方法上添加
@Transactiona
l注释。请注意,使用者(
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
}

谢谢,但是如何为兔子消费者设置spring支持呢?ThanksHow您是否在ListenerContainer上设置了MessageListener?你能添加你的spring配置吗?谢谢,我刚刚在我的初始帖子中添加了它。你的消费者已经是一个bean了,添加@Transactional注释就足够了。您的DB已经有了TransactionManager?谢谢,是的,我已经设置好了,奇怪为什么它不工作