2010-11-08 80 views
0
<beans> 
<batch:job id="job1" restartable="false"> 
    <batch:step id="step1" next="step2"> 
    <batch:tasklet> 
     <batch:chunk reader="readerA" writer="writerA" commit-interval="1" /> 
    </batch:tasklet> 
    </batch:step> 
    <batch:step id="step2"> 
    <batch:tasklet ref="tasklet1"/> 
    </batch:step> 
    <batch:listeners> 
    <batch:listener ref="listenerA" /> 
    </batch:listeners> 
</batch:job> 

<bean id="listenerA" class="com.example.ListenerA" scope="step"> 
    <property name="archiveDate" value="#{jobParameters['jobRunDate']}" /> 
</bean> 
</beans> 

爲什麼上面給我以下錯誤:Spring批處理:如何在步驟偵聽器中使用佔位符?

java.lang.IllegalStateException: No context available while replacing placeholders. 

什麼是解決這個問題的最好方法?

回答

2

我相信問題是你想要一個步驟監聽器,而不是一個工作監聽器。步驟範圍超出了您定義偵聽器的範圍,因此範圍步驟不可用 - 如果它是作業偵聽器,則不需要佔位符,因爲您可以從當前JobExecution獲取變量。

如果不是改變你的配置,像這樣(假設這是一個循序漸進監聽器,而不是一個工作聽衆):

<batch:step id="step1" next="step2"> 
<batch:tasklet> 
    <batch:chunk reader="readerA" writer="writerA" commit-interval="1" /> 
    <batch:listeners> 
     <batch:listener ref="listenerA" /> 
</batch:listeners> 
</batch:tasklet> 
</batch:step> 

我相信會給你一個正確的一步偵聽器「第一步」一步 - 如果您想要第二步的監聽器,請使用類似的配置。

+0

不幸的是,這是一個工作監聽者。 – 2011-04-07 17:51:08

+0

作業執行偵聽器包含以下方法:void beforeJob(JobExecution執行)和void afterJob(JobExecution執行)void。正如我在我的回答中所說的,如果它是一個作業偵聽器,則不需要佔位符 - 在beforeJob中只需使用execution.getJobInstance()。getJobParameters()。getDate(「jobRunDate」); (假設它是一個日期,如果沒有的話,使用適當的getter作爲值)。 – MetroidFan2002 2011-04-10 23:12:12

+0

這不似乎違反了通過xml進行配置的想法嗎? – 2011-05-19 23:34:04

相關問題