笔者在开发javaweb项目中遇到了需要使用定时任务的需求,自然而然想到了要用spring的quartz组件。
配置文件如下

当我们去指定的service层去实现具体业务逻辑的时候,遇到了一个事物的问题
我们的项目持久层框架用的是hibernate。在调用hibernate底层方法时,遇到了一个bug,获取不到hibernate的session。项目整体封装了底层的增删改查的工具方法,获取session的方法是sessionFactory.getCurrentSession();百度里面说是,要获取session的前提是保证开启事物。我代码里的事物实现是在service类上加上@Transactional注解。spring的注解是用spring的aop实现的,实现aop的前提是需要有类的切换才能实现动态代理,实现切面。(一般来说我们都是用控制层去调用业务层代码,在业务层添加事物注解)。
好了,找到报错的原因,就可以针对性的解决了。
我是手动开启一个事物,代码结束后在手动提交事物。代码如下:
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
PlatformTransactionManager txManager = ContextLoader.getCurrentWebApplicationContext().getBean(PlatformTransactionManager.class);
//spring无法处理thread的事务,声明式事务无效
//记录一个事物状态
TransactionStatus tstatus = txManager.getTransaction(def);
//提交这个事物
txManager.commit(tstatus);
------------------------------------------------------结束---------------------------------------------