Omar B.
Omar B.

Reputation: 501

spring batch writer don't work without any error

I tried a springbatch example, I used a reader to read from database and a writer to write to a database. when I run the main class , it printed elements from database (that mean read correctly from database) but stopped there no write in database and don t show any error . I m confused any help will be appreciated . I put the console log if that can help you. thank you .

spring-context:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
                           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
 <import resource="datasource.xml"/>
 <import resource="/job1.xml"/>


 <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
   <property name="dataSource" ref="dataSource1"></property>
   <property name="transactionManager" ref="transactionManager"></property>
   <property name="databaseType" value="oracle"></property>
 </bean >



    <bean  id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
       <property name="jobRepository" ref="jobRepository"> </property>
     </bean>
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
   <property name="dataSource" ref="dataSource1"></property>
 </bean>
     </beans>

job1.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc">


<bean id="personReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step">
    <property name="dataSource" ref="dataSource1"/>
    <property name="sql" value="SELECT internal_id,individual_id from Person where internal_id &lt; 350"/>
    <property name="rowMapper">
       <bean  class="main.PersonMapper" />
    </property>
</bean>

<bean id="marshallerPerson" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
 <property name="classesToBeBound">
   <value>main.Person1</value>
 </property>
</bean>

 <bean id="personWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter" >
   <property name="dataSource" ref="dataSource1"/>
   <property name="sql">
     <value>
        <![CDATA[
            insert into  BDE1 (ID,Numero) values (:internal_id,:individual_id)
       ]]>
     </value>
   </property>
   <!-- ce qui suist map the  : internal_id et  individual_id with the object in the 
   reader which is Person  here. so Person should have  this values in SQL property -->
   <property name="itemSqlParameterSourceProvider" >
       <bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />


   </property>


 </bean>

<batch:job id="personJob">
      <batch:step id="stepAAA">
          <batch:tasklet>
        <batch:chunk reader="personReader" writer="personWriter" commit-interval="100">

             </batch:chunk>
          </batch:tasklet>
      </batch:step>
</batch:job>
</beans>

datasource.xml :

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
                           http://www.springframework.org/schema/jdbc    
                           http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd">
        <bean id="dataSource1"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
           <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
           <property name="url" value="jdbc:oracle:thin:*********"></property>
           <property name="password" value="I6"></property>
           <property name="username" value="I6"></property>
         </bean>  
   </beans>

personMapper.java :

package main;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;



public class PersonMapper implements RowMapper<Person1>
{

  public Person1 mapRow(ResultSet rs, int arg1) throws SQLException
  {
    Person1 person=new Person1();
    person.setInternal_id(rs.getLong("internal_id"));
    person.setIndividual_id(rs.getLong("individual_id"));
    System.out.println("int_id :"+person.getInternal_id()+"   indiv_id :"+person.getIndividual_id());


    return person;
  }

}

person1.java :

package main;

public class Person1
{
  Long internal_id;
  Long individual_id;

  public Long getInternal_id()
  {
    return internal_id;
  }
  public void setInternal_id(Long internal_id)
  {
    this.internal_id = internal_id;
  }

  public Long getIndividual_id()
  {
    return individual_id;
  }
  public void setIndividual_id(Long individual_id)
  {
    this.individual_id = individual_id;
  }

}

main class :

package main;

import java.util.Date;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{
  public static void main (String [] args ) 
  {
  ApplicationContext context=new ClassPathXmlApplicationContext("config/spring-context.xml");
  JobLauncher jobLauncher=(JobLauncher) context.getBean("jobLauncher");
  Job job=(Job) context.getBean("personJob");
  try
  {
   JobParameters param=new JobParametersBuilder().addLong("max", (long) 269).toJobParameters();
    //JobParameters param=new JobParametersBuilder().addLong("now", System.currentTimeMillis()).toJobParameters();

   JobExecution jobExecution=jobLauncher.run(job, param);
   System.out.println("job done..."+jobExecution.getStatus());
  }
  catch (JobExecutionException e) {

  }
 }
}

console log :

Oct 19, 2018 2:05:23 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4ccabbaa: startup date [Fri Oct 19 14:05:23 EDT 2018]; root of context hierarchy
Oct 19, 2018 2:05:23 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [config/spring-context.xml]
Oct 19, 2018 2:05:23 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [config/datasource.xml]
Oct 19, 2018 2:05:23 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [config/job1.xml]
Oct 19, 2018 2:05:23 PM org.springframework.beans.factory.support.DefaultListableBeanFactory registerBeanDefinition
INFO: Overriding bean definition for bean 'personReader' with a different definition: replacing [Generic bean: class [org.springframework.batch.item.database.JdbcCursorItemReader]; scope=step; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=false; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [config/job1.xml]] with [Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in BeanDefinition defined in class path resource [config/job1.xml]]
Oct 19, 2018 2:05:23 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: oracle.jdbc.OracleDriver
Oct 19, 2018 2:05:23 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: oracle.jdbc.OracleDriver
Oct 19, 2018 2:05:23 PM org.springframework.oxm.jaxb.Jaxb2Marshaller createJaxbContextFromClasses
INFO: Creating JAXBContext with classes to be bound [class main.Person1]
Oct 19, 2018 2:05:24 PM org.springframework.batch.core.launch.support.SimpleJobLauncher afterPropertiesSet
INFO: No TaskExecutor has been set, defaulting to synchronous executor.
Oct 19, 2018 2:05:25 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run
INFO: Job: [FlowJob: [name=personJob]] launched with the following parameters: [{max=269}]
Oct 19, 2018 2:05:27 PM org.springframework.batch.core.job.SimpleStepHandler handleStep
INFO: Executing step: [stepAAA]
int_id :1   indiv_id :778141667541
.
.
.
int_id :122   indiv_id :547249915381

Upvotes: 1

Views: 2619

Answers (1)

Mahmoud Ben Hassine
Mahmoud Ben Hassine

Reputation: 31730

You are using a ResoucelessTransactionManager in your configuration:

<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager">

This transaction manager does not interact with any resource (hence the name), think of it as a "NoOp" transaction manager (more details in the documentation here).

So this transaction manager does not commit any transaction, hence, since there is no error, items will (silently) not be written to your database. You can use a org.springframework.jdbc.datasource.DataSourceTransactionManager for your step and your items will be written to the database when no errors occur.

Hope this helps.

Upvotes: 2

Related Questions