2015-01-09 18 views
5

Próbuję wprowadzić parametry pracy do niestandardowego ItemReadera. Przejrzałem wszystkie notatki StackOverflow na ten temat (przykład: How to get access to job parameters from ItemReader, in Spring Batch?) i widzę, że jest to często występujący problem, który jest w większości nierozwiązany. Mam nadzieję, że wiosenny guru (ktoś z Michaelem Minellą) to zobaczy i będzie miał wgląd.JobParameters od Spring Batch

Doszedłem do stwierdzenia, że ​​parametry pracy są dostępne w około jednym z 10 przebiegów, nawet bez zmian kodu lub konfiguracji. Jest to przypadek losowego sukcesu, a nie losowego niepowodzenia, więc trudno go wyśledzić.

Wkopałem się w kod źródłowy za pomocą debuggera i ustaliłem, że kiedy to się nie powiedzie, w okresie, w którym odbywa się wstrzyknięcie, nie jest rejestrowana żadna fasola o nazwie jobParameters na wiosnę.

Używam Wiosna 4.1.4 z wiosny partii 3.0.2 i wiosna-data-WZP 1.7.1 i wiosna-data-świetlicy 1.9.1, działa w java klasy 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; 
    } 
} 

Praca parametry uruchamiania:

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

uruchom context.xml (minus puch):

<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 (minus puch):

<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

Jak rozpocząć pracę? – wassgren

+0

A dlaczego używasz '@ Lazy' do wstrzyknięcia? Czy to jest potrzebne do twojego zadania? – wassgren

+0

Na razie uruchamiam zadanie z poziomu IDE Eclipse. Zostanie uruchomiony z wiersza poleceń po uruchomieniu. Używam @ Lazy, ponieważ pozwala mi to obejść i przejść do prawdziwego projektu, oczekując na rozwiązanie. Istnieją inne sposoby na pobranie parametrów do komponentu bean, ale w dłuższej perspektywie spowodują one problemy z obsługą. –

Odpowiedz

2

ważne kroki, aby uzyskać parametry pracy, aby zadaniem jest zdefiniowanie fasoli StepScope i upewnienie się, że twój czytnik jest komponentem @StepScope.

chciałbym spróbować wykonać następujące czynności:

Najpierw upewnij się, że jest to krok fasoli zdefiniowane. To miło z wykorzystaniem konfiguracji Konfiguracja Java:

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

Następnie upewnij się, że fasola jest krok scoped o wykorzystaniu @StepScope -annotation (prawie jak w przykładzie). Wstrzyknij @Value, który nie jest @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

przy pomocy @Scope ("step") - inicjuje komponent bean, ale parametr zadania o zakresie kroku nie jest dostępny. użyciu @StepScope, fasola nie może zainicjować: Nie można podklasy final class klasa com.sun.proxy $ Proxy42 \t na org.springframework.cglib.proxy.Enhancer.generateClass (Enhancer.java:446) ...itp. –

+0

@ pojo-guy, dziwne niepowodzenie. Proszę zauważyć, że istnieje klasa o nazwie "StepScope" ORAZ adnotacja o nazwie '@ StepScope'. Niewygodne;) – wassgren

+0

W innym wątku omówiono przypadkowe proxy w StepScope. Per @ Mike Manella (wiodący lider technologii Spring Batch) StepScope jest wygodnym skrótem dla zakresu ("krok", ...). Rozdzielczość tego polega na zrozumieniu i zastosowaniu adnotacji Zakresu z właściwymi parametrami. Kiedy mam szansę, zastosuję je i zgłoś wyniki. –

-1

Spróbuj dodać @DependsOn ("jobParameters") po @Component ("sourceSelectionReader")

+0

To tylko potwierdza, że ​​nie ma fasoli o nazwieParameters. Dzięki –

Powiązane problemy