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);
}