2015-01-09 15 views
5

Sto tentando di inserire parametri di lavoro in un oggetto personalizzato. Ho esaminato tutte le note StackOverflow sull'argomento (esempio: How to get access to job parameters from ItemReader, in Spring Batch?) e vedo che questo è un punto di dolore comune che è per lo più irrisolto. Spero che un guru primaverile (@Michael Minella chiunque) vedrà questo e avrà qualche intuizione.Parametri lavoro da Spring Batch

Ho ottenuto fino a determinare che i parametri di lavoro sono disponibili su una delle 10 esecuzioni, anche senza codice o modifiche di configurazione. Questo è un caso di successo casuale piuttosto che un fallimento casuale, quindi è difficile da rintracciare.

Ho scovato il codice sorgente con il debugger e ho stabilito che quando questo fallisce, nessun bean del nome jobParameters viene registrato in primavera nel momento in cui avviene l'iniezione.

Sto usando Primavera 4.1.4 con molla-batch 3.0.2 e la primavera-dati-JPA 1.7.1 e la primavera-dati-commons 1.9.1, in esecuzione in Java di classe 8.

Java

@Component("sourceSelectionReader") 
@Scope("step") 
public class SourceSelectionReaderImpl 
implements ItemReader<MyThing> { 
    private Map<String,Object> jobParameters; 

// ... snip ... 


    @Autowired 
    @Lazy 
    @Qualifier(value="#{jobParameters}") 
    public void setJobParameters(Map<String, Object> jobParameters) { 
     this.jobParameters = jobParameters; 
    } 
} 

dei parametri del processo di lancio:

launch-context.xml job1 jobid(long)=1 

lancio-context.xml (meno il fluff):

<context:property-placeholder location="classpath:batch.properties" /> 

<context:component-scan base-package="com.maxis.maximo.ilm" /> 

<jdbc:initialize-database data-source="myDataSource" enabled="false"> 
    <jdbc:script location="${batch.schema.script}" /> 
</jdbc:initialize-database> 

<batch:job-repository id="jobRepository" 
    data-source="myDataSource" 
    transaction-manager="transactionManager" 
    isolation-level-for-create="DEFAULT" 
    max-varchar-length="1000"/> 

<import resource="classpath:/META-INF/spring/module-context.xml" /> 

Module-context.xml (meno il fluff):

<description>Example job to get you started. It provides a skeleton for a typical batch application.</description> 

<import resource="classpath:/META-INF/spring/hibernate-context.xml"/> 
<import resource="classpath:/META-INF/spring/myapp-context.xml"/> 

<context:component-scan base-package="com.me" /> 
<bean class="org.springframework.batch.core.scope.StepScope" /> 

<batch:job id="job1"> 
    <batch:step id="step0002" >    
     <batch:tasklet transaction-manager="transactionManager" start-limit="100" > 
      <batch:chunk reader="sourceSelectionReader" writer="selectedDataWriter" commit-interval="1" /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 
+0

come si avvia il lavoro? – wassgren

+0

E, perché stai usando '@ Lazy' per l'iniezione? È necessario per il tuo compito? – wassgren

+0

Sto avviando il lavoro dall'interno del mio IDE eclissi, per ora. Verrà lanciato dalla riga di comando quando verrà attivato. Io uso @Lazy perché mi consente di aggirare questo problema e andare avanti con il progetto reale, in attesa di una risoluzione. Ci sono altri modi per inserire i parametri nel bean, ma a lungo andare creeranno problemi di supporto. –

risposta

2

I passi importanti per ottenere i parametri di lavoro per il lavoro consiste nel definire il bean StepScope e assicurarsi che il lettore sia un componente @StepScope.

vorrei provare il seguente:

prima assicurarsi che non v'è un passo-bean definito. Questo è bello configurazione utilizzando Configuration Java:

@Configuration 
public class JobFrameworkConfig { 
    @Bean 
    public static StepScope scope() { 
     return new StepScope(); 
    } 
    // jobRegistry, transactionManager etc... 
} 

Poi, assicurarsi che il fagiolo è step-ambito con l'uso della @StepScope -annotation (quasi come nel tuo esempio). Inietti un @Value che non sia @Lazy.

@Component("sourceSelectionReader") 
@StepScope // required, also works with @Scope("step") 
public class SourceSelectionReaderImpl implements ItemReader<MyThing> { 
    private final long myParam; 

    // Not lazy, specified param name for the jobParameters 
    @Autowired 
    public SourceSelectionReaderImpl(@Value("#{jobParameters['myParam']}") final long myParam) { 
     this.myParam = myParam; 
    } 

    // the rest of the reader... 
} 
+0

usando @Scope ("step") - il bean si inizializza ma il parametro del job con scope step non è disponibile. utilizzando @StepScope, il fagiolo non riesce a inizializzare: Impossibile sottoclasse finale com.sun.proxy classe classe $ Proxy42 \t a org.springframework.cglib.proxy.Enhancer.generateClass (Enhancer.java:446) ...ecc –

+0

@ pojo-guy, strano fallimento. Si prega di osservare che esiste una classe chiamata 'StepScope' e un'annotazione chiamata' @ StepScope'. Inconveniente;) – wassgren

+0

In un'altra discussione, è stato discusso il proxy accidentale con StepScope. Per @Mike Manella (lead tecnologico di Spring Batch) StepScope è una comodità di scorciatoia per Scope ("step", ...). La risoluzione per questo è comprendere e applicare l'annotazione dell'ambito con i parametri corretti Quando ho la possibilità li applicherò e riferirò i risultati. –

-1

Provare aggiungono @DependsOn ("jobParameters") dopo @Component ("sourceSelectionReader")

+0

Ciò conferma semplicemente che non vi è alcun bean denominato jobParameters. Grazie –

Problemi correlati