spring 只兔子和 spring 笔交易
spring rabbit and spring transactions
我有一个 spring 兔子消费者喜欢:
@Override public void onMessage(Message amqpMessage, Channel channel)
throws Exception {
//..some code goes here - I want it to be in spring transaction
}
问题是 onMessage 方法中的代码不在事务中。我查了一下,我保存数据到3tables,然后抛出异常,然后保存到第4table。 3 previos tables 的数据不会被回滚。如何在 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
方法上添加 @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 兔子消费者喜欢:
@Override public void onMessage(Message amqpMessage, Channel channel)
throws Exception {
//..some code goes here - I want it to be in spring transaction
}
问题是 onMessage 方法中的代码不在事务中。我查了一下,我保存数据到3tables,然后抛出异常,然后保存到第4table。 3 previos tables 的数据不会被回滚。如何在 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
方法上添加 @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
}