因为我们公司目前有一些场景上用到mq的地方,目前的做法是先插入数据库,在数据库的后面追加异步方法,做MQ生产。伪代码如下
@Transactional(rollbackFor = Exception.class)
public int insert(){
// 插入数据库
int insert = dao.insert(object);
// 异步方法
asynchMq(object);
return insert;
}
你可以把插入数据库的地方封装成一个独立的service事务,然后事务完成以后,再发送MQ不就行了
你应该是在本地事务提交完成后,再操作MQ。你的代码有误,请调整。
另外 ,运行过程 ,有可能 本地提交成功后,插入MQ时失败(死机重启或者其他各种不可控原因),还需要添加补偿机制。
有种队列叫 延时队列, 不过这也涉及消息实时性的问题。
看你这个mq的即时性要求吧,,你可以生成一个唯一ID事务成功,异步mq检查到这id成功了再发请求,这基本上就100%无问题了
两个办法。
一个是MQ业务里面有代码能验证提交的这个消息是否是正确的。比如会判断数据库里面是否有记录。
另一个是切面执行MQ,把MQ和插入独立成两个。
既然是要保证事务提交后再发MQ,为什么要将异常发MQ的语句写在insert的事务方法内?
AOP,@AfterReturning
MQ自带事务啊
三种方式
1> 将mq生成放到表里, 和上面mysql在一个库, 定时任务调度定时发送
2> 监听事务的提交, 事务提交以后在发送mq
3> 通过事务消息去保证 eg rockertmq消息