java - 春兔和春交易

标签 java spring rabbitmq spring-rabbit

我有一个 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 个表中的数据不会回滚。 Spring 如何正确做到这一点?我希望 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 方法上添加 @Transactional 注释。请注意,使用者 (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
}

关于java - 春兔和春交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333095/

相关文章:

python - 如何连接到rabbitMQ docker容器?

java - 像 Java "instance-filtering"[RabbitMQ] 这样处理消息的最 Pythonic 方式是什么

java - 在java中编码特殊字符

java - 这是使用 Java 2D 图形 API 的正确方法吗?

java - 如何让 DateTimeFormat 与 Spring MVC 一起工作?

spring - 在 jhipster 中为用户实体添加属性

spring-boot - 多个带有 Spring Boot 的 Rabbitmq 队列

java - 如何用这样的方式拆分带有数字的字符串 |(12)|(23)

java - 如何在所需目录中打开文件对话框

java - Spring MVC - 实例化 servlet 类时出错