最近做一个异步导入,就是上传文件后即“受理”完成,向前端返回受理结果,然后后台新开一个线程,进行导入任务,导入完成后更新数据库任务表状态,如果中途验证或发生异常,更新任务状态并记录失败原因。核心代码如下:
//创建异步任务,向数据库任务表写入一条数据
new Thread(new Runnable() {//创建线程
@Override
public void run() {
Db.tx(new IAtom() {//外部事物
@Override
public boolean run() throws SQLException {
try {
//读取文件内容
//导入文件内容
//导入成功,将任务状态更新为成功,进度100%
} catch (Exception e) {
//导入失败
Db.tx(new IAtom() {//内部事务
@Override
public boolean run() throws SQLException {
//在excel文件最后一列追加错误原因
//将任务状态更新为失败,保存错误原因
return true;
}
});
//返回false,本来希望更新任务状态后,外部事务回滚,但是最后发现内部事务也被回滚了
return false;
}
return true;
}
});
}
}).start();求指导,因为jfinal没有类似于spring的事务传播机制,所以暂时没有太好的办法。