最近做一个异步导入,就是上传文件后即“受理”完成,向前端返回受理结果,然后后台新开一个线程,进行导入任务,导入完成后更新数据库任务表状态,如果中途验证或发生异常,更新任务状态并记录失败原因。核心代码如下:
//创建异步任务,向数据库任务表写入一条数据 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的事务传播机制,所以暂时没有太好的办法。