2016-05-20 2 views
0

春のバッチが新しく、アイテムプロセッサで検出された無効なレコードをスキップするためにスキップ可能な例外で例外が1つ宣言されています。ジョブの実行中にすべてのスキップされたレコードを追跡し、最後にジョブ実行リスナーなどを使用してスキップされたすべてのレコードをメールで送信する方法を教えてください。 提案があれば助かります。スキップされたすべてのレコードを保存し、春のバッチでメールに送信します。

春-のcontext.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:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> 

    <import resource="classpath:context-datasource.xml" /> 


    <bean 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 

     <property name="location"> 
      <value>springbatch.properties</value> 
     </property> 
    </bean> 

    <bean id="validator" 
     class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 

    <bean id="jobRepository" 
     class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> 

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


    <!-- ItemReader which reads from database and returns the row mapped by 
     rowMapper --> 
    <bean id="databaseItemReader" 
     class="org.springframework.batch.item.database.JdbcCursorItemReader"> 

     <property name="dataSource" ref="dataSource" /> 

     <property name="sql" value="SELECT * FROM employee" /> 

     <property name="rowMapper"> 
      <bean class="com.sample.springbatch.jdbc.EmployeeRowMapper" /> 
     </property> 

    </bean> 


    <!-- ItemWriter writes a line into output flat file --> 
    <bean id="databaseItemWriter" 
     class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 

     <property name="dataSource" ref="dataSource" /> 

     <property name="sql"> 
      <value> 
       <![CDATA[   
        insert into actemployee(empId, firstName, lastName,additionalInfo) 
        values (?, ?, ?, ?) 
       ]]> 
      </value> 
     </property> 

     <property name="itemPreparedStatementSetter"> 
      <bean class="com.sample.springbatch.jdbc.EmployeePreparedStatementSetter" /> 
     </property> 

    </bean> 




    <!-- Optional ItemProcessor to perform business logic/filtering on the input 
     records --> 
    <bean id="itemProcessor" class="com.sample.springbatch.EmployeeItemProcessor"> 
     <property name="validator" ref="validator" /> 
    </bean> 

    <!-- Step will need a transaction manager --> 
    <bean id="transactionManager" 
     class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> 


    <bean id="recordSkipListener" class="com.sample.springbatch.RecordSkipListener" /> 

    <!-- Actual Job --> 
    <batch:job id="employeeToActiveEmployee"> 
     <batch:step id="step1"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="databaseItemReader" writer="databaseItemWriter" 
        processor="itemProcessor" commit-interval="10" skip-limit="500"> 
        <batch:skippable-exception-classes> 
         <batch:include 
          class="javax.validation.ValidationException" /> 
        </batch:skippable-exception-classes> 
       </batch:chunk> 

      </batch:tasklet> 
      <batch:listeners> 
       <batch:listener ref="recordSkipListener" /> 
      </batch:listeners> 
     </batch:step> 
    </batch:job> 


    <!-- Email API bean configuarion --> 
</beans> 


Processor.java 
     public class EmployeeItemProcessor implements ItemProcessor<Employee, ActiveEmployee> { 

    private Validator validator; 

    public Validator getValidator() { 
     return validator; 
    } 

    public void setValidator(Validator validator) { 
     this.validator = validator; 
    } 

    @Override 
    public ActiveEmployee process(Employee employee) throws Exception { 
     BindingResult results = BindAndValidate(employee); 
     if (results.hasErrors()) { 
      buildValidationException(results); 
     } 
     System.out.println("Processing employee object:" + employee); 
     ActiveEmployee activeEmployee = new ActiveEmployee(employee.getEmpId(), employee.getFirstName(), 
       employee.getLastName(), "This is additional info"); 
     return activeEmployee; 

    } 

    private BindingResult BindAndValidate(Employee employee) { 
     DataBinder binder = new DataBinder(employee); 
     binder.setValidator(validator); 
     binder.validate(); 
     return binder.getBindingResult(); 

    } 

    private void buildValidationException(BindingResult results) { 
     StringBuilder msg = new StringBuilder(); 
     for (ObjectError error : results.getAllErrors()) { 
      msg.append("-*-*-*- \n" + error.toString() + "-*-*-*- \n"); 
     } 
     throw new ValidationException(msg.toString()); 
    } 

} 

感謝!!

+0

[tag:batch-file]のタグ情報を読んだことがありますか?私はそれがWindowsに関連していることをあなたが知っているとは思いません。 – aschipfl

答えて

0

スキップされたレコードをファイルに書き込む場合はSkipListenerを使用し、ステップが完了したらStepExecutionListenerを使用してファイルを電子メールで送信します。

+0

こんにちはマイケル。これは私の問題を解決するだろうと思われる。私はそれを試してみましょう。助けてくれてありがとう。 –

関連する問題