1
<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>

上記で次のエラーが表示されるのはなぜですか。

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

この問題を回避する最善の方法は何ですか?

4

1 に答える 1

3

問題は、ジョブリスナーではなく、ステップリスナーが必要だったことだと思います。ステップ スコープは、リスナーを定義したスコープの外にあるため、スコープ ステップは使用できません。ジョブ リスナーの場合、現在の 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>

「step1」ステップの適切なステップリスナーが得られると思います-2番目のステップのリスナーが必要な場合と同様の構成です。

于 2011-03-23T19:02:23.387 に答える