2016-07-13 6 views
0

Prämisse: Ich bin neu im Frühjahr Batch.
Ich versuche, die Feder Batch-Admin anpassen, aber bis jetzt konnte ich nicht meine Klassen lesen einige Eigenschaften aus einer externen Datei.
Meine Jobs extrahieren Daten aus einer Drittanbieter-Datenbank, um einen Bericht zu drucken. Daher benötige ich zwei Datenquellen: eine für die Erfassung der Berichtsinformationen und eine für die Speicherung des Status und der Metadaten des Jobs.
Ich habe das Tutorial gelesen: http://docs.spring.io/spring-batch-admin/reference/customization.html
und viele andere Tutorials und den folgenden Beitrag load external config file in spring batch admin.
Noch konnte ich die Anwendung nicht starten. Es muss auf Tomcat 6 laufen.
dies ein Bildschirm schießen von meinem Projektbaum ist von der amtlichen Beispiel angepasst:
enter image description herelesen externe Eigenschaften Dateien im Frühjahr batch admin

dies ist meine Konfigurationsklasse:

@Configuration 
@EnableBatchProcessing 
public class RegistroGiornalieroConfiguration extends DefaultBatchConfigurer { 

    private final static Logger log = LoggerFactory.getLogger(RegistroGiornalieroConfiguration.class); 

    private final static Date data = null; 

    @Autowired 
    public JobBuilderFactory jobFactory; 

    @Autowired 
    public StepBuilderFactory stepFactory; 


    @Autowired 
    VolumiPropertySource volumiPropertySource; 

    @Value("${batch.jdbc.driver}") 
    private String driverName; 

    /** 
    * datasource di default, viene resitituito dall'annotazione Autowired 
    * @return 
    * @throws SQLException 
    */ 
    @Bean(name="springBatchDatasource") 
    @Primary 
    public DataSource springBatchDatasource() throws SQLException { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(driverName);//"com.mysql.jdbc.Driver"); 
//  dataSource.setUrl(env.getProperty("springBatchUrl"));//"jdbc:mysql://localhost/spring_batch_annotations"); 
//  dataSource.setUsername(env.getProperty("springBatchUser"));//"root"); 
//  dataSource.setPassword(env.getProperty("springBatchPassword"));//"root"); 
     return dataSource; 
    } 


    /** 
    * Datasource secondario, viene restituito da getDatasource 
    * @return 
    * @throws SQLException 
    */ 
    @Bean(name="estarDatasource") 
    public DataSource estarDatasource() throws SQLException { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(driverName);//"com.mysql.jdbc.Driver"); 
//  dataSource.setUrl(env.getProperty("url"));//"jdbc:mysql://localhost/spring_batch_annotations"); 
//  dataSource.setUsername(env.getProperty("user"));//"root"); 
//  dataSource.setPassword(env.getProperty("password"));//"root"); 
     return dataSource; 
    } 


// @PostConstruct 
// public void init() 
// { 
//  Properties p = volumiPropertySource.getIniProperties(); 
//  MutablePropertySources sources = env.getPropertySources(); 
//  sources.addFirst(new PropertiesPropertySource("volumi",p)); 
//  env.getActiveProfiles(); 
// } 



    @Bean 
    @StepScope 
    public JdbcCursorItemReader<RegistroGiornaliero> reader( 
      @Value("#{jobParameters[data]}") 
      Date data) 
     { 
     System.out.println("reader"); 

//  select  protocol.nprotoc,protocol.dataprot,protocol.arrpar,protocol.numdoc, 
//   protocol.datadoc,protocol.OGGETTO,protocol.ANNULLATO,protocol.USERINS as protuser, 
//   protimg.DOCID,protimg.USERINS imguser ,protimg.PRINCIPALE, 
//   assegna.livello,assegna.possesso,assegna.SEQUENZA, 
//   organigramma.LIVELLO,organigramma.DESCRIZIONE, 
//   protente.ente 
//   from 
//   protocol left outer join protimg on protocol.NPROTOC = protimg.NPROTOC 
//   left outer join protente on protocol.NPROTOC = protente.NPROTOC 
//   left outer join assegna on protocol.NPROTOC = assegna.NPROTOC 
//   left outer join organigramma on assegna.LIVELLO = organigramma.LIVELLO 
//   where 
//    protocol.dataprot = 20160616 and protocol.NPROTOC = '201600014709' 
//   order by protocol.nprotoc,assegna.SEQUENZA;  


     StringBuilder sb = new StringBuilder("select") 
      .append(" protocol.nprotoc,protocol.dataprot,protocol.arrpar,protocol.numdoc,") 
      .append(" protocol.datadoc,protocol.OGGETTO,protocol.ANNULLATO,protocol.USERINS as protuser,") 
      .append(" protimg.DOCID,protimg.USERINS imguser ,protimg.PRINCIPALE,") 
      .append(" assegna.possesso,assegna.SEQUENZA,") 
      .append(" organigramma.LIVELLO,organigramma.DESCRIZIONE,") 
      .append(" protente.ente ") 
      .append(" from protocol left outer join protimg on protocol.NPROTOC = protimg.NPROTOC ") 
      .append(" left outer join protente on protocol.NPROTOC = protente.NPROTOC ") 
      .append(" left outer join assegna on protocol.NPROTOC = assegna.NPROTOC ") 
      .append(" left outer join organigramma on assegna.LIVELLO = organigramma.LIVELLO ") 
      .append(" where ") 
      .append(" protocol.dataprot = ? ") 
      .append(" order by protocol.nprotoc,assegna.SEQUENZA "); 


//  StringBuilder sb = new StringBuilder("select") 
//   .append(" protocol.nprotoc,protocol.dataprot,protocol.arrpar,protocol.numdoc,") 
//   .append(" protocol.datadoc,protocol.OGGETTO,protocol.ANNULLATO,protocol.USERINS as protuser, ") 
//   .append(" protimg.DOCID,protimg.USERINS imguser ,protimg.PRINCIPALE, ") 
//   .append(" assegna.livello,assegna.possesso,assegna.SEQUENZA, ") 
//   .append(" organigramma.LIVELLO as livelloOrg,organigramma.DESCRIZIONE, ") 
//   .append(" protente.ente ") 
//   .append(" from protocol,protimg,protente,assegna,operatori,organigramma ") 
//   .append(" where ") 
//   .append(" protocol.NPROTOC = protimg.NPROTOC and protocol.NPROTOC = assegna.NPROTOC ") 
//   .append(" and protocol.NPROTOC = protente.NPROTOC and assegna.LIVELLO = organigramma.LIVELLO ") 
//   .append(" and protocol.dataprot = ? "); 
     JdbcCursorItemReader<RegistroGiornaliero> reader = new JdbcCursorItemReader<RegistroGiornaliero>(); 
     try { 
      reader.setDataSource(estarDatasource()); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     reader.setPreparedStatementSetter(new ParameterSetter(data)); 
     reader.setSql(sb.toString()); 
     reader.setRowMapper(estarRowMapper()); 
     reader.setVerifyCursorPosition(false); 
     return reader; 
    } 

    @Bean 
    public RegistroGiornalieroProcessor processorGenerazioneRegistro() { 
     return new RegistroGiornalieroProcessor(); 
    } 

    @Bean 
    public ItemWriter<RegistroGiornaliero> pdfwriter() { 
     return new PDFItemWriter<RegistroGiornaliero>(); 
    } 


    @Bean 
    public JobExecutionListener listener() { 
     return new JobCompletionNotificationListener(); 
    } 

    @Bean 
    public RegistroGiornalieroRowMapper estarRowMapper() { 
     return new RegistroGiornalieroRowMapper(); 
    } 



    @Bean 
    public Job generaRegistroGiornaliero() 
    { 
      return jobFactory 
        .get("generaRegistroGiornaliero") 
        .incrementer(new RunIdIncrementer()) 
        .flow(leggiDocumentiProtocollo()) 
        .end() 
        .build(); 
    } 


    @Bean 
    public Step leggiDocumentiProtocollo() 
    { 
     return stepFactory.get("leggiDocumentiProtocollo") 
       .<RegistroGiornaliero, RegistroGiornaliero> chunk(10) 
       .reader(reader(data)) 
       .processor(processorGenerazioneRegistro()) 
       .writer(pdfwriter()) 
       .build(); 
    } 



    @Override 
    public JobRepository getJobRepository() { 


     JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); 
     // use the autowired data source 
     try { 
      factory.setDataSource(springBatchDatasource()); 
     } catch (SQLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     factory.setTransactionManager(getTransactionManager()); 

     try { 
      factory.afterPropertiesSet(); 
      return factory.getObject(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      //e.printStackTrace(); 
     } 
     return null; 
    } 



} 

diese Konfiguration ist mein Job (registrogiornaliero.xml):

<?xml version="1.0" encoding="utf-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     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.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">   
    <context:annotation-config/> 
    <context:component-scan base-package="it.infogroup.estav.registrogiornaliero"/> 
</beans> 

und schließlich das ist mein env.xml, wie Stackoverflow Beitrag:

jede Hilfe wird

geschätzt werden

Antwort

0

Disclaimer: Ich bin neu Charge zu springen, daher könnte dies nicht die beste Lösung sein:

  1. ich die propertysource Anmerkung auf meine Konfigurationsklasse verwendet , ich habe es entfernt und verändert die env-context.xml wie unten dargestellt:

    http://www.springframework.org/schema/beans/spring-beans.xsd ">

    <!-- Use this to set additional properties on beans at run time --> 
    <bean id="placeholderProperties" 
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
        <property name="locations"> 
         <list> 
          <value>classpath:/org/springframework/batch/admin/bootstrap/batch.properties</value> 
          <value>${app.conf}/batch-default.properties</value> 
          <!-- <value>classpath:batch-${ENVIRONMENT:hsql}.properties</value>--> 
          <value>${app.conf}/batch-${ENVIRONMENT}.properties</value> 
          <!-- here we load properties from external config folder --> 
          <value>${app.conf}/estardatasource.properties</value> 
         </list> 
        </property> 
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
        <property name="ignoreResourceNotFound" value="false" /> 
        <property name="ignoreUnresolvablePlaceholders" value="false" /> 
        <property name="order" value="1" /> 
    </bean> 
    

$ {app.conf} ist ein JVM-Argument.
2. Ich habe die Verwendung der Klasse Environment durch Platzhaltervariablen es ersetzt.

@Value("${volumi}") 
private String volumi; 

Problem Nummer 2:: mehrere Datenquellen, gibt es eine Menge von Stellen, die unterschiedlichen Lösungen beschreiben, einschließlich dem Überschreiben der DefaultBatchConfigurer Klasse und ihre getJobRepository Methode.
Die einzige Lösung, die für mich gearbeitet hat, ist das Hinzufügen von

@ComponentScan(basePackageClasses = DefaultBatchConfigurer.class) 

in die Konfigurationsklasse, wie beschrieben (und deutlich erklärt) in Use of multiple DataSources in Spring Batch

Und außer Kraft setzen data-source-context.xml Datei: Ich habe platzierte es unter/src/main/resources/META-INF/spring/batch/override /.
Sein Inhalt ist:

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

    <bean id="estarDatasource" name="estarDatasource" primary="false" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${batch.jdbc.driver}" /> 
     <property name="url" value="${url}" /> 
     <property name="username" value="${user}" /> 
     <property name="password" value="${password}" /> 
     <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/> 
     <property name="validationQuery" value="${batch.jdbc.validationQuery}"/> 
    </bean> 

    <!-- Initialise the database if enabled: --> 
    <jdbc:initialize-database data-source="estarDatasource" enabled="${batch.data.source.init}" ignore-failures="DROPS"> 
     <jdbc:script location="${batch.drop.script}"/> 
     <jdbc:script location="${batch.schema.script}"/> 
     <jdbc:script location="${batch.business.schema.script}"/> 
    </jdbc:initialize-database> 


    <bean id="dataSource" autowire-candidate="true" primary="true" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="${batch.jdbc.driver}" /> 
     <property name="url" value="${batch.jdbc.url}" /> 
     <property name="username" value="${batch.jdbc.user}" /> 
     <property name="password" value="${batch.jdbc.password}" /> 
     <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/> 
     <property name="validationQuery" value="${batch.jdbc.validationQuery}"/> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <!-- Initialise the database if enabled: --> 
    <jdbc:initialize-database data-source="dataSource" enabled="${batch.data.source.init}" ignore-failures="DROPS"> 
     <jdbc:script location="${batch.drop.script}"/> 
     <jdbc:script location="${batch.schema.script}"/> 
     <jdbc:script location="${batch.business.schema.script}"/> 
    </jdbc:initialize-database> 

</beans> 

Hoffnung diese Hilfe einige andere Anfänger und ich würde mich freuen, zu wissen, ob dies eine geeignete Lösung ist, und schließlich, wie die Eigenschaften in die Umwelt Klasse zu lesen.