quarz的job通常会依赖业务对象执行操作,通常这些业务对象可以在job初始化时通过dataMap传入,但是在采用数据库持久化Job的模式下,这些业务对象会被持久化,所以需要对业务对象进行序列化操作,但由于很多业务对象无法进行序列化,所以持久化的过程就会报错。
如果能够在job中实现业务对象的依赖注入就能避开上面的问题,那么如何实现呢?
下面这种方式就可以轻松实现:
只需要在Job的execute方法中加入SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)即可
示例如下:
@Component
public class DataMigrationJob implements Job {
@Autowired
private DataMigrationService dataMigrationService;
public static final Logger logger = LoggerFactory.getLogger(DataMigrationJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 使得job对象可以通过注解实现依赖注入
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
CronTaskRequestBO migrationInfo = (CronTaskRequestBO) jobExecutionContext.getMergedJobDataMap().get("migrationInfo");
DataMigrationRequestBO request = getDataMigrationRequestBO(migrationInfo);
logger.info("start migration task");
dataMigrationService.startMigration(request);
}