2017-12-22 24 views
1

스프링 배치 작업을 실행해야합니다. 내 요구 사항은 내가 parallel.xml에게 스프링 설정 파일에 병렬로스프링 프로파일을 사용하여 스프링 작업을 구성하는 방법

<job id="job" xmlns="http://www.springframework.org/schema/batch" 
incrementer="incrementer"> 

<step id="step1" next="step2"> 
    <tasklet ref="tasklet" /> 
</step> 

<split id="step2" task-executor="assetStepAsyncTaskExecutor"> 
    <flow> 
     <step id="split1"> 
      <tasklet ref="tasklet" /> 
     </step> 
    </flow> 
    <flow> 
     <step id="split2"> 
      <tasklet ref="tasklet" /> 
     </step> 
    </flow> 
</split> 
<listeners> 
    <listener ref="listener" /> 
</listeners> 
</job> 

하고 단계를 실행할 수있는 작업 설정을 배치

봄 프로파일에 따라 순서/병렬로 몇 단계를 실행하는 것입니다 Spring 구성 파일에서 단계를 순차적으로 실행하는 작업 구성 default.xml

<job id="job" xmlns="http://www.springframework.org/schema/batch" 
incrementer="incrementer"> 

<step id="step1" next="step2"> 
    <tasklet ref="tasklet" /> 
</step> 
<step id="step2" next="step3"> 
      <tasklet ref="tasklet" /> 
</step> 
<step id="step3"> 
    <tasklet ref="tasklet" /> 
</step> 
<listeners> 
    <listener ref="listener" /> 
</listeners> 
</job> 

그리고 스프링 프로파일을 사용하여 작업 구성간에 전환하고 있습니다.

<beans profile="parallel"> 
<import resource="classpath:/spring/parallel.xml" /> 
</beans> 

<beans profile="default"> 
<import resource="classpath:/spring/default.xml" /> 
</beans> 

config.xml은 web.xml의 contextConfigLocation context-param을 통해로드됩니다.

<context-param> 
<param-name>contextConfigLocation</param-name> 
<param-value> 
// other config files 
classpath*:/spring/default.xml 
classpath*:/spring/parallel.xml 
</param-value> 
</context-param> 

나는 상황에 PARAMS로 프로파일 정보를 전달하고

<context-param> 
<param-name>spring.profiles.default</param-name> 
<param-value>default</param-value> 
</context-param> 

<context-param> 
<param-name>spring.profiles.active</param-name> 
<param-value>parallel</param-value> 
</context-param> 

나는 그것이 default.xml에와 parallel.xml에서 스프링 빈을로드하지 않습니다는 contextConfigLocation에있는 파일을 포함하지 않는 경우 이 때문에 NoBeanFoundException이 발생합니다.

Error creating bean with name 'controller' defined in class path resource [config.xml]: Cannot resolve reference to bean 'batchJob' while setting bean property 'job'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'batchJob' is defined 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3339) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3780) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 
    at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:163) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:61) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:96) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_121] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_121] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_121] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_121] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_121] 
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'batchJob' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:527) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1083) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) [spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    ... 26 more 

두 파일을 모두 포함하는 경우. 나는 DuplicateJobException을 얻는다.

12/21/2017 17:00:58,971 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/]] (ServerService Thread Pool -- 85) JBWEB000287: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener: java.lang.IllegalStateException: org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [batchJob] was already registered 
    at org.springframework.batch.core.configuration.support.AutomaticJobRegistrar.start(AutomaticJobRegistrar.java:164) [spring-batch-core-2.1.8.RELEASE.jar:] 
    at org.springframework.batch.core.configuration.support.AutomaticJobRegistrar.onApplicationEvent(AutomaticJobRegistrar.java:128) [spring-batch-core-2.1.8.RELEASE.jar:] 
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:303) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:911) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:428) [spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE] 
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3339) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3780) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1] 
    at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:163) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:61) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:96) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_121] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_121] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_121] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_121] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_121] 
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) 
Caused by: org.springframework.batch.core.configuration.DuplicateJobException: A job configuration with this name [batchJob] was already registered 
    at org.springframework.batch.core.configuration.support.MapJobRegistry.register(MapJobRegistry.java:52) [spring-batch-core-2.1.8.RELEASE.jar:] 
    at org.springframework.batch.core.configuration.support.DefaultJobLoader.doLoad(DefaultJobLoader.java:152) [spring-batch-core-2.1.8.RELEASE.jar:] 
    at org.springframework.batch.core.configuration.support.DefaultJobLoader.load(DefaultJobLoader.java:114) [spring-batch-core-2.1.8.RELEASE.jar:] 
    at org.springframework.batch.core.configuration.support.AutomaticJobRegistrar.start(AutomaticJobRegistrar.java:161) [spring-batch-core-2.1.8.RELEASE.jar:] 
    ... 19 more 

무엇이 누락 되었습니까?

+0

스프링 활성 프로필에 따라 병렬 또는 순차적으로 하나의 작업을 정의하고 싶습니까? – lzagkaretos

+0

예. 작업의 몇 단계는 활성 프로파일에 따라 병렬로 또는 순차적으로 실행됩니다. –

+0

사용하는 스프링의 버전을 물어보고 상황을 설명하기 위해 github repo를 만들 수 있습니까? – lzagkaretos

답변

0

스프링 배치 각 작업 이름은 고유해야합니다.이 이름은 작업을 구성하는 동안 id = "job"으로 정의됩니다. 위의 구성은 "batchJob"과 동일한 작업 이름으로 두 개의 작업을 설정하려고 시도했기 때문에 예외가 표시됩니다.

필요한 것을 얻으려면이 작업을 수행하십시오.

<job id="jobA" xmlns="http://www.springframework.org/schema/batch" 
incrementer="incrementer"> 

<step id="step1" next="step2"> 
    <tasklet ref="tasklet" /> 
</step> 

<split id="step2" task-executor="assetStepAsyncTaskExecutor"> 
    <flow> 
     <step id="split1"> 
      <tasklet ref="tasklet" /> 
     </step> 
    </flow> 
    <flow> 
     <step id="split2"> 
      <tasklet ref="tasklet" /> 
     </step> 
    </flow> 
</split> 
<listeners> 
    <listener ref="listener" /> 
</listeners> 
</job> 


<job id="jobB" xmlns="http://www.springframework.org/schema/batch" 
incrementer="incrementer"> 

<step id="step1" next="step2"> 
    <tasklet ref="tasklet" /> 
</step> 
<step id="step2" next="step3"> 
      <tasklet ref="tasklet" /> 
</step> 
<step id="step3"> 
    <tasklet ref="tasklet" /> 
</step> 
<listeners> 
    <listener ref="listener" /> 
</listeners> 
</job> 

컨트롤러에서 컨텍스트 매개 변수를 기반으로 jobA 또는 jobB를 호출 할 수 있습니다.

+0

동일한 작업 이름을 갖고 있다고 생각하지 않습니다. https://github.com/karthikch53/spring-profile/tree/master/src/main/resources/spring/batch/jobs이 설정은 저에게 효과적입니다. –

+0

전체 프로젝트를 공유 할 수 있습니까? –

+0

전체 프로젝트 https://github.com/karthikch53/spring-profile –

0

as @lzagkaretos 의견에 제안 된 문제는 Spring 버전에서 발생했습니다. 3.2.2.RELEASE로 버전을 업데이트하면 문제가 해결되었습니다.