使用场景
在常见的操作中,我们需要在数据库操作完成(事务提交完成)后进行一系列相关操作,如redis更新操作、发送消息到其他系统等操作。
笔者在实际开发中遇到了这个问题 方法里面加了事务并且发送rabbitmq 消息 但是顺序总是rabbitmq 消息先发送 事务后处理
于是笔者就找了网上很多资料查阅了一番
解决方案
可以使用spring自带的事务处理机制完成。继承 TransactionSynchronizationAdapter 类执行相关操作。先看一下TransactionSynchronizationAdapter 的源码方法
/*
* Copyright 2002-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.transaction.support;
import org.springframework.core.Ordered;
/**
* Simple {@link TransactionSynchronization} adapter containing empty
* method implementations, for easier overriding of single methods.
*
* <p>Also implements the {@link Ordered} interface to enable the execution
* order of synchronizations to be controlled declaratively. The default
* {@link #getOrder() order} is {@link Ordered#LOWEST_PRECEDENCE}, indicating
* late execution; return a lower value for earlier execution.
*
* @author Juergen Hoeller
* @since 22.01.2004
*/
public abstract class TransactionSynchronizationAdapter implements TransactionSynchronization, Ordered {
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
@Override
public void suspend() {
}
@Override
public void resume() {
}
@Override
public void flush() {
}
@Override
public void beforeCommit(boolean readOnly) {
}
@Override
public void beforeCompletion() {
}
@Override
public void afterCommit() {
}
@Override
public void afterCompletion(int status) {
}
}
可以看到里面有好多回调方法,我们可以在afterCommit执行完成后进行相关的操作,
核心的实现类如下:
AfterTransactionService类:实现相关接口,并将其注册到对应的事务管理器中。
AfterTransactionOpt类:为后置操作,即:完成service层相关操作后执行相关相关的异步操作,以完成一些边缘操作。
在对应的事务方法中加上事务后置处理 如下
就能达到 先执行事务后发送消息的操作了