본문 바로가기
IT/Back-End

java에서 .bat파일 args를 쿼츠 잡 파라미터로 넘기는 방법

by 피리부는 공대생 2020. 2. 18.

안녕하세요 용재형 입니다. 

이번 포스팅은 java에서 .bat파일 args를 쿼츠 잡 파라미터로 넘기는 방법 입니다. 

java에서 .bat파일과 쿼츠를 이용한 배치를 실행하고 있습니다. 
기존에는 한개의 배치 파일을 통해, 한개의 잡을 실행하게 되어, 분산 처리가 되지 않아, 속도에 이슈가 생겼습니다. 

.bat파일에 arg를 넘겨, 그 arg를 쿼츠잡으로 실행하여, 한개의 쿼츠잡에 여러개의 배치가 돌 수 있겠끔, 개발을 진행 했습니다. 

구조를 본 다면, 아래의 그림과 같습니다.


먼저 bat파일에 고정적인 arg값을 넣었습니다. 이 args값은 job에서 select할때 키값으로 사용하고 있습니다. 
예를 들어, SyncHistJob_dev.bat args 0,1,2,3 -> 총 2만건에 데이터에 고객키가 0,1,2,3만 처리 
SyncHistJob_dev_2.bat args 4,5,6 -> 총 2만건에 데이터에 고객키가 4,5,6 만 처리 
SyncHistJob_dev_3.bat args 7,8,9,Z -> 총 2만건에 데이터에 고객키가 7,8,9,Z 만 처리 

먼저 SyncHistJob_dev.bat 파일에서는 아래와 같이 세팅합니다. 동일하게 dev2.bat, dev3 args만 변경해서 처리해주면 됩니다.

REM ---------------------------------------------- REM - USER PARAMETER SET REM ---------------------------------------------- 
set PKG_PATH=com.nt.batch.ifs.quartz.main 
set PG_ID=SyncHistBatch 
set args1=0,1,2,3 
set args2=%2 
set args3=%3 
set args4=%4 
set args5=%5 
set args6=%6 
set args7=%7

.bat에 설정되어 있는 PKG_PATH, PG_ID를 호출 합니다. 

public class SyncHistBatch {

    protected static final Log log = LogFactory.getLog(SyncHistBatch.class);
    
    private String seperate = "";
	
    
    public void setSeperate(String seperate) {
        this.seperate = seperate;
    }
    public String getSeperate() {
       return this.seperate;
    }
    
    public static void main(String[] args) throws Exception {
    	                      
           if( args[5].length() > 0){
        	   
        	   ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/quartz/Spring-Quartz-SyncHist.xml");
        	   
        	   SyncHistBatch bean =  (SyncHistBatch)applicationContext.getBean("SyncHistBatch");
        	   bean.setSeperate(args[5]);
           }
		
	}
  

}

쿼츠가 설정되어 있는 Spring-Quartz-SyncHist.xml에 SyncHistBatch를 Bean으로 설정하여, 받아온 args를 bean에 set 합니다. 

아래는 Spring-Quartz-SyncHist.xm 설정한 부분 입니다. 

    <bean id="SyncHistBatch" class="com.nt.batch.ifs.quartz.main.SyncHistBatch">
        <property name="seperate"      		value="" />
    </bean>
    
    <!-- Spring Quartz -->
    <bean name="SyncHistSchedJob" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass" value="com.nt.batch.ifs.quartz.job.SyncHistSchedJob" />
        <property name="jobDataAsMap">
          <map>
            <entry key="SyncHistTask" value-ref="SyncHistTask" />
             <entry key="SyncHistBatch" value-ref="SyncHistBatch" />
          </map>
        </property>
    </bean>

아래와 같이, SyncHistBatch에 getSeperate를 가져와, jobExecute에서 String으로 쿼리에 사용하면 됩니다.

@Service
public class SyncHistSchedJob extends QuartzJobBean {

  @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    	
    	log.debug("param >>>>>>>>>"+this.SyncHistBatch.getSeperate());
    	this.jobExecute(this.SyncHistBatch.getSeperate());
    	
    }

@SuppressWarnings("rawtypes")
	private void jobExecute(String seperate){
    
    	List<String> seperateList = Arrays.asList(seperate.split(","));
        
    }

}

 

댓글