2016-08-04 6 views
0

ステップ1の下のコードに見られるように、私はusers.xmlを読み、ステップ2のデータベースに書き込みます。私はuserdetails.xmlから読み込み、データベースに書き込みますが、 step2のtbl_user。どうやってやるの?バッチ・バッチをxmlファイルから読み取り、データベースに書き込みます。ステップ1を必要とするステップ2の自動生成キー

の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-2.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd「>

<import resource="../config/context.xml" /> 
<import resource="../config/database.xml" />    


<bean id="xmlItemReader1" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
    <property name="resource" value="file:xml/outputs/users.xml" /> 
    <property name="fragmentRootElementName" value="user" /> 
    <property name="unmarshaller" ref="userUnmarshaller"/>      
</bean> 

<bean id="xmlItemReader2" class="org.springframework.batch.item.xml.StaxEventItemReader"> 
    <property name="resource" value="file:xml/outputs/userdetails.xml" /> 
    <property name="fragmentRootElementName" value="userdetail" /> 
    <property name="unmarshaller" ref="userUnmarshaller"/>      
</bean> 

<bean id="itemProcessor1" class="com.qmetry.recovery.mapper.UserItemProcessor" /> 

<bean id="itemProcessor2" class="com.qmetry.recovery.mapper.UserDetailItemProcessor" /> 

<job id="testJob2" xmlns="http://www.springframework.org/schema/batch"> 
     <step id="step2_1"> 
      <tasklet transaction-manager="transactionManager"> 
       <chunk reader="xmlItemReader1" writer="databaseItemWriter1" processor="itemProcessor1" 
         commit-interval="100" /> 
      </tasklet>     
     <listeners>     
      <listener ref="testListener" /> 
     </listeners>    
     </step> 
     <step id="step2_2"> 
      <tasklet transaction-manager="transactionManager"> 
       <chunk reader="xmlItemReader2" writer="databaseItemWriter2" processor="itemProcessor1" 
         commit-interval="100" /> 
      </tasklet>     
     </step>    
</job> 
<bean id="testListener" class="com.qmetry.recovery.mapper.TestListener" scope="step" /> 

<bean id="databaseItemWriter1" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql"> 
     <value> 
      <![CDATA[   
       insert into TBL_USER(USERNAME,EMAILID) 
       values (?, ?)       
      ]]> 
     </value> 
    </property> 

    <!--We need a custom setter to handle the conversion between Jodatime LocalDate and MySQL DATE BeanPropertyItemSqlParameterSourceProvider--> 
    <property name="itemPreparedStatementSetter"> 
     <bean class="com.qmetry.recovery.mapper.UserItemPreparedStatementSetter"/> 
    </property> 
</bean> 
<bean id="databaseItemWriter2" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql"> 
     <value> 
      <![CDATA[   
       insert into TBL_USERDETAIL(USERID,CONTACT) 
       values (?, ?) 
      ]]> 
     </value> 
    </property> 

    <!--We need a custom setter to handle the conversion between Jodatime LocalDate and MySQL DATE BeanPropertyItemSqlParameterSourceProvider--> 
    <property name="itemPreparedStatementSetter"> 
     <bean class="com.qmetry.recovery.mapper.UserDetailItemPreparedStatementSetter"/> 
    </property> 
</bean>  

users.xmlの

あなたは将来のステップにデータを渡す必要が

userdetails.xml

<?xml version="1.0" encoding="UTF-8"?><userdetails> 
    <userdetail> 
     <userDetailId>1</userDetailId> 
     <userId__TblUser>1</userId__TblUser> 
     <contact>1111111111</contact> 
    </userdetail> 
    <userdetail> 
     <userDetailId>2</userDetailId> 
     <userId__TblUser>1</userId__TblUser> 
     <contact>2222222222</contact> 
    </userdetail> 
    <userdetail> 
     <userDetailId>4</userDetailId> 
     <userId__TblUser>1</userId__TblUser> 
     <contact>4444444444</contact> 
    </userdetail> 
</userdetails> 
+1

「userdetails.xml」には、ユーザーと関連性のあるものがなければなりません。 1つのxmlファイルから別のXMLファイルにユーザーが属することをどのように判断しますか? –

+0

私は、DBテーブルから読み込んでXMLに書き込む春バッチを使用して生成したXMLを使用しています。今、私はそれを逆に実装する必要があります。つまり、XMLから読み込み、データベースに書き込みます。 – TaherT

+0

私はコメントを言い換えることができます。ユーザーの詳細のうち、どのユーザーが同じユーザーに属しているかをどのように知るのですか?なぜ2 xmlファイルをエクスポートするだけでも、なぜ1ではないのですか?あなたが望むのは、xmlファイルの1つに追加情報がなくても不可能なことです。すべてを単一のxmlに入れるか、または両方のxmlファイルを一緒に読み込みます(ユーザーIDを別のファイルに関連付けることができます)。 –

答えて

0

。具体的なドキュメントについてはhttp://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps

を参照してください。私はドキュメントからその例を実装し、ここにいくつかの前提を置いてあなたの設定に調整しました。

手順1で読み込み(または書き込み、それは渡すデータを取得すると異なります)の間、StepExecutionにデータを格納する必要があります。

public class YourItemReader implements ItemReader<Object> 
    private StepExecution stepExecution; 

    public void read(Object item) throws Exception { 
     // ... 

     ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
     stepContext.put("tbl_user", someObject); 
    } 

    @BeforeStep 
    public void saveStepExecution(StepExecution stepExecution) { 
     this.stepExecution = stepExecution; 
    } 

あなたのXMLは次のようになります:

<beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener"> 
    <beans:property name="keys" value="tbl_key"/> 
</beans:bean> 

そして最後に、あなたがステップで値を取得する必要があります。

<step id="step2_1"> 
    <tasklet transaction-manager="transactionManager"> 
     <chunk reader="xmlItemReader1" writer="databaseItemWriter1" processor="itemProcessor1" commit-interval="100" /> 
    </tasklet>     
    <listeners>     
     <listener ref="testListener" /> 
     <listener ref="promotionListener"/> 
    </listeners> 
</step> 

promotionListener豆を追加し、次の自分のxmlItemReaderに追加2.再度ステップ2の読者にそれを必要とするので、ステップ2の読者に次のコードを追加する必要があります。

public class YourItemReader2 implements ItemReader<Object> 
    private Object someObject; 

    @BeforeStep 
    public void retrieveInterstepData(StepExecution stepExecution) { 
     JobExecution jobExecution = stepExecution.getJobExecution(); 
     ExecutionContext jobContext = jobExecution.getExecutionContext(); 
     this.someObject = jobContext.get("tbl_key"); 
    } 

今、あなたは、ステップ1

EDITに読み込まれた値へのアクセスも持っている - 余分な読み取りステップのためのいくつかの構成例を追加:ステップ1の後

には、次の読者を持つ単純なステップ2を追加データベースから新しい値を取得する

<bean id="itemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" 
    scope="step"> 
    <property name="dataSource" ref="dataSource" />    
    <property name="sql"> 
     <value> 
      <![CDATA[ 
       YOUR SELECT STATEMENT 
      ]]> 
     </value> 
    </property> 
    <property name="rowMapper" ref="rowMapper" />  
</bean> 

とシンプルなRowMapperの豆

<bean id="rowMapper" class="exampleRowMapper" /> 

あなたのフェッチデータを反映するためには、明らかにexampleRowMapperを記述する必要があります。例:

public class ExampleRowMapper implements ParameterizedRowMapper<String> { 

    @Override 
    public String mapRow(ResultSet rs, int rowNum) throws SQLException { 
     return String.valueOf(rs.getString(1)); 
    } 

} 

ダミーライターでは、ステップ実行を追加し、ステップ実行コンテキストに値を保存します。:

public class DummyItemWriter implements ItemWriter<Object> { 
    private StepExecution stepExecution; 

    @Override 
    public void write(List<? extends Object> item) throws Exception { 
     ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
     stepContext.put("someKey", someObject); 
    }  
} 

そして、作家のための豆:

<bean id="savingDummyWriter" class="your.package.DummyItemWriter" /> 

ステップでリーダライタを包みます。

<step id="step2"> 
    <tasklet>  
     <chunk reader="itemReader" writer="dummyItemWriter" commit-interval="1" />  
    </tasklet>   
    <listeners> 
     <listener ref="promotionListener"/> 
    </listeners> 
</step> 
+0

答えをありがとう。私の場合は少し違います。ステップ1では、XMLから読み込み、DBに挿入すると新しいプライマリキーが生成されるようになりました。ステップ2のキーをtbl_userdetailのforiegnキーとして使用します。 – TaherT

+0

あなたの質問にその情報を追加して、実際の問題を反映しています。したがって、ステップ1の後に正しいと分かっていれば、データベースに行が作成されました。追加された中間ステップで完全な行を取得し、必要な情報を取得し、プロモーションリスナーを使用してその情報をステップ3に渡します。 –

+0

users.xmlの場合と同様に説明します。users.xmlとuserdetails.xmlの両方でuserId = 1しかし、DBのuserIdに再度書き込むと、userId = 10のuserdetails.xmlに自動的に生成され、userId = 10になります。私はuserId = 10を1の代わりにudpateする必要があります。そのitemwriter1は新しく生成されたuserIdを与えるべきです – TaherT

関連する問題