Reputation: 8814
I am getting below error when trying to run the Spring Batch code. I have configured JobRepository and JobLauncher and also configured the Job. When running via main method getting the below error
Code
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@XX.YY.INT:1527/TEST" />
<property name="username" value="TEST_USER" />
<property name="password" value="BGFFFF" />
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseType" value="ORACLE" />
</bean>
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
Error
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jobLauncher' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:702)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1180)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at com.mastercard.ess.eds.SendCustomerApp.main(SendCustomerApp.java:27)
Main Method:
public class SendCustomerApp {
public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:/META-INF/spring/ABC_context.xml");
JobLauncher jobLauncher = (JobLauncher) applicationContext.getBean("jobLauncher");
Job job = (Job) applicationContext.getBean("ABCJob");
JobExecution execution = jobLauncher.run(job, new JobParameters());
System.out.println("EXIT STATUS :: "+execution.getStatus());
System.out.println("DONE !!");
}
}
ABC_Job.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@XX.YY.INT:1527/TEST" />
<property name="username" value="TEST_USER" />
<property name="password" value="BGFFFF" />
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseType" value="ORACLE" />
</bean>
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<batch:job id="billDataBatchJob">
..........
..........
...........
.............
..............
</batch:job>
</beans>
I enabled the logs and saw the below logs
2018-06-25 15:16:25 DEBUG StandardEnvironment:127 - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
2018-06-25 15:16:25 DEBUG PathMatchingResourcePatternResolver:317 - Resolved classpath location [META-INF/spring/ABC.job.xml] to resources []
2018-06-25 15:16:25 DEBUG XmlBeanDefinitionReader:224 - Loaded 0 bean definitions from location pattern [classpath*:META-INF/spring/ABC.job.xml]
2018-06-25 15:16:25 DEBUG ClassPathXmlApplicationContext:615 - Bean factory for org.springframework.context.support.ClassPathXmlApplicationContext@51016012: org.springframework.beans.factory.support.DefaultListableBeanFactory@1a968a59: defining beans []; root of factory hierarchy
2018-06-25 15:16:25 DEBUG ClassPathXmlApplicationContext:728 - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@2286778]
2018-06-25 15:16:25 DEBUG ClassPathXmlApplicationContext:752 - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@3e9b1010]
2018-06-25 15:16:25 DEBUG DefaultListableBeanFactory:745 - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1a968a59: defining beans []; root of factory hierarchy
2018-06-25 15:16:25 DEBUG ClassPathXmlApplicationContext:779 - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@6ddf90b0]
2018-06-25 15:16:25 DEBUG DefaultListableBeanFactory:251 - Returning cached instance of singleton bean 'lifecycleProcessor'
2018-06-25 15:16:25 DEBUG PropertySourcesPropertyResolver:91 - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jobLauncher' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:702)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1180)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at com.mastercard.ess.eds.CustomerFileGenerationMain.main(CustomerFileGenerationMain.java:17)
Upvotes: 2
Views: 1776
Reputation: 8814
I was able to solve the below by using the FileSystemXMlApplication context. I strongly believe the project structure of maven project which I am using is not correct or its using both Boot and MainMethod.
public class MainApp {
public static void main(String[] args) {
PropertyConfigurator.configure("src/main/resources/log4j.properties");
String[] springConfig = { "C:\\XXXX\\src\\main\\resources\\META-INF\\spring\\XXXXX-job.xml" };
ApplicationContext context = new FileSystemXmlApplicationContext(springConfig);
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("XXXJob");
try {
JobExecution execution = jobLauncher.run(job, new JobParameters());
System.out.println("Exit Status : " + execution.getStatus());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Done");
}
}
Upvotes: 1
Reputation: 758
I have created a project to test your code and everything goes well. I just change dataSource bean properties to connect to an h2-db instead of Oracle. about your problem consider, you pasted ABC_Job.xml content but in your code, you refer to ABC_context.xml, maybe this is your problem. by the way, if you add proper logger and set log level to debug, you can see which beans created by spring, and you can trace your beans to find the cause of the problem.
Upvotes: 1