Spring загрузил бин, но не может получить его с помощью Autowire или ApplicationContextAware - PullRequest
0 голосов
/ 12 марта 2019

У меня есть компонент, который загружает конфигурационный XML Spring Spring в методе postConstruct:

    @PostConstruct
    private void starter(){            
        String[] springConfig = {
                "SpringBatch/override/application-context.xml",
                "SpringBatch/override/database.xml",
                "SpringBatch/jobs/job-dataExtraction.xml",
        };   


        ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
    }
}

Я использую таймер для проверки записи в БД и запуска задания.Таймер вызывает метод ниже в другом классе.

public static void startUnidataJob(MessageDTO<String> msgDto){

        JobLauncher jobLauncher = (JobLauncher) ApplicationContextProvider.getApplicationContext().getBean("jobLauncher");  //Problem occurs here

            Job job = (Job) ApplicationContextProvider.getApplicationContext().getBean("dataExtractionJob");


            try {
                logger.info("With in starting...........................");
                JobExecution execution = jobLauncher.run(job, new JobParameters());

            } catch (Exception e) {
                logger.error("Job launching Exception : ", e);
            }
        }
    }

Проблема при загрузке приложения, тогда я могу видеть из журнала, что загружен bean jobLauncher.Но когда ApplicationContextProvider.getApplicationContext().getBean("jobLauncher") выполняется, он выбрасывает .NoSuchBeanDefinitionException: No bean named 'jobLauncher' is defined:

2019-03-11 02:03:39,594 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'jobLauncher'
2019-03-11 02:03:39,594 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'jobLauncher'
2019-03-11 02:03:39,595 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Eagerly caching bean 'jobLauncher' to allow for resolving potential circular references
2019-03-11 02:03:39,596 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'jobRepository'
2019-03-11 02:03:39,597 [main] DEBUG o.s.a.f.JdkDynamicAopProxy - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [org.springframework.batch.core.repository.support.SimpleJobRepository@61d84e08]
2019-03-11 02:03:39,604 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.core.task.SimpleAsyncTaskExecutor#3f3ddbd9'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.core.task.SimpleAsyncTaskExecutor#3f3ddbd9'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'jobLauncher'
2019-03-11 02:03:39,605 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'jobLauncher'

Вот код ApplicationContextProvider

@Component
public class ApplicationContextProvider implements ApplicationContextAware{

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

Следующее присутствует в загружаемом application-context.xmlчерез ClassPathXmlApplicationContext

<bean id="jobLauncher"
        class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor">
            <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
        </property>
    </bean>

    <!-- Must set this -->
    <bean
        class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
        <property name="jobRegistry" ref="jobRegistry" />
    </bean>

    <bean id="jobRegistry"
        class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

    <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

Как ни странно, приложение отлично работает в моем Local. На сервере у меня запущено 2 одинаковых весенних пакетных Java-приложения.Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 13 марта 2019

Я не вижу необходимости в ApplicationContextProvider.Вы можете внедрить job и jobLauncher в класс, в котором вы определили startUnidataJob.Например:

public class JobScheduler {

    private static final Logger logger = LoggerFactory.getLogger(JobScheduler.class.getName());

    private Job job;

    private JobLauncher jobLauncher;

    public JobScheduler(Job job, JobLauncher jobLauncher) {
        this.job = job;
        this.jobLauncher = jobLauncher;
    }

    public void startUnidataJob(MessageDTO<String> msgDto) {
        try {
            logger.info("With in starting...........................");
            JobExecution execution = jobLauncher.run(job, new JobParameters());
        } catch (Exception e) {
            logger.error("Job launching Exception : ", e);
        }
    }
}

Вы можете объявить этот компонент как компонент в контексте вашего приложения, и он будет внедрен в job и jobLauncher.Затем вы используете его для запуска задания, когда это необходимо.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...