SSM集成Quartz时,发现在定时任务中使用@Transactional注释报错,采用了业务类与定时任务类分离的方法,仍无法解决。于是在定时任务类里自定义了事务,解决。
public class QuartzSample extends QuartzJobBean { @Autowired private QuartzSampleSrv sampleSrv; @Autowired private ApplicationContext applicationContext; Logger logger = LogManager.getLogger(); int excuteTimes = 0; @Override public void executeInternal(JobExecutionContext context) throws JobExecutionException { DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) applicationContext.getBean("transactionManager"); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态 try { //SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); sampleSrv.doJob(); transactionManager.commit(status); } catch (Exception e) { System.out.println(e.getMessage()); logger.trace(e.getMessage()); transactionManager.rollback(status); } } }