java - Spring 批处理 : How do I use placeholders in step listeners?

标签 java spring-batch

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

解决此问题的最佳方法是什么?

最佳答案

我认为问题在于您想要一个步骤监听器,而不是工作监听器。步骤范围超出了您定义监听器的范围,因此范围步骤不可用 - 如果它是作业监听器,则不需要占位符,因为您可以从当前的 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”步骤提供适当的步骤监听器 - 如果您想要第二步的监听器,则类似配置。

关于java - Spring 批处理 : How do I use placeholders in step listeners?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126787/

相关文章:

java - 在不使用 break 的情况下跳出嵌套的 for 循环

spring - 记录 Spring Batch 执行的 SQL 查询

java - 如何使用Spring Boot批处理运行.bat文件

spring - Spring Batch "default"上下文变量是什么?

java - Spring Batch JpaItemWriter vs HibernateItemWriter 以及为什么在使用 HibernateItemWriter 时需要 HibernateTransactionManager

java - Spring AOP - 在调用 setter 之前获取旧字段值

java - 存储敏感信息

java - 使用 0 值调用 setSoLinger 与根本不启用 soLinger 有什么区别?

spring - 将 JSON 反序列化器用于批处理作业执行上下文

java - 检查线是否以点开头,然后将其删除