В поле @Autowired есть ноль, когда вы пытаетесь ввести в весенне-кварцевом задании? - PullRequest
0 голосов
/ 11 ноября 2019

Существует Spring-приложение, используемое с Spring-Batch и Spring-Quartz.

Существует класс @Service, который запускает Spring-Batch и называется MyService.

@Service
@EnableBatchProcessing
@EnableScheduling
public class MyService {
    @Autowired
    JobLauncher jobLauncher;
    @Autowired
    Job processExportJob;

    public void helloMethod() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
        JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
                .toJobParameters();
        jobLauncher.run(processExportJob, jobParameters);
    }
}

Существует задание и конфигурация "весенние кварталы", которые пытаются внедрить этот serrvice и метод запуска helloMethod () Если задание содержит только регистратор, проблем нет и работает хорошо.

ТогдаПытаюсь залить свой сервис в одно из полей. После каждого запуска приложения первый раз задание содержит это поле, но в следующий раз в этом поле есть ноль.

Я пытался просто создать свой сервис с помощью нового: MyService service = new MyService ();

Но в сервисе все поля с автоматической связью после первого успешного запуска становятся пустыми

Приложение развернуто на веб-узле 8.5.5.13 (кластер с 2 узлами), oracle11g и spring4. Java8.

Затем, используя аннотацию @Autowired, я внедряю сервис в задание, если это задание работает ровно один раз. Введенное поле является нулевым во время всех последующих выполнений задания. Более того, если я создаю сервис вне весны:

MyService service  = new MyService();


@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class MyJob implements Job {
    @Autowired
    private MyService service;
    private static final String MESSAGE = "===================================QUARTZ TACT===================================";
    private Logger logger = Logger.getLogger(getClass());

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.log(Level.INFO, MESSAGE);
        try {
            service.helloMethod();
        } catch (Exception e) {
            e.printStackTrace();
            logger.log(Level.ERROR, " Failed..");
            logger.log(Level.ERROR, Arrays.toString(e.getStackTrace()));
        } 
    }
}

1 Ответ

0 голосов
/ 11 ноября 2019

Из другого места полезно использовать это:

ApplicationContext springContext =
                    WebApplicationContextUtils.getWebApplicationContext(ContextLoaderListener.getCurrentWebApplicationContext().getServletContext());

Object bean = springContext.getBean("myService");

Это решило мою проблему

...