Spring Batch和Spring 3.1配置文件

5

最近遇到一个问题,使用Spring 3.1开启了Profiles特性,并且使用多个 < beans > 定义时无法在Spring Batch自身的标签中正常工作。

<beans profile="prod">
    <bean id ="test" class="java.lang.String"></bean>
    <batch:job id="job" abstract="true" >
     <batch:listeners>

        <batch:listener ref="jobExecutionContextDateSetter" />
        <batch:listener ref="jobStatusListener"/>
      </batch:listeners>
    </batch:job>
</beans>

<beans profile="dev">
    <bean id ="test" class="java.lang.String"></bean>
    <batch:job id="job" abstract="true" >
      <batch:listeners>
          <batch:listener ref="jobExecutionContextDateSetter" />
       </batch:listeners>
    </batch:job>
</beans>

运行测试示例(未启用任何配置文件),Spring 抱怨找到了多个 ID 为 "job" 的注解。有什么想法吗?

你有没有找到解决这个问题的方法?我也遇到了同样的问题。 - John Mark
还没有。针对我的情况,我创建了一个解决方法 - 对于开发人员,我在dev配置文件中创建了“stubJobStatusListener”作为侦听器的存根实现。并且将batch:Job放在配置文件之外。 - magulla
1个回答

2

我曾遇到相同的问题,这是由于Spring XML验证器引起的。当您创建一个Spring XML文件时,Spring会首先将该文件发送到XML解析器以进行验证。

我的意思是,您可以定义两个或更多具有相同ID的bean。然后,您会发现Spring XML验证器在没有任何问题的情况下解析您的XML文件。尽管在后续阶段,如果这些bean在同一配置文件中或不在任何配置文件中,Spring本身会抛出异常。

但是在Spring Batch中,XML验证器不允许具有相同ID的两个作业。

解决方案是,您可以在任何配置文件之外定义批处理,并在配置文件中按以下方式定义其bean:

<batch:job id="job1" abstract="true" job-repository="jobRepository">
        <batch:listeners>
            <batch:listener ref="jobListener"/>
        </batch:listeners>
</batch:job>

<beans profile="prod">
        <bean id="jobListener" class="com.batch.ProductionJobListener"/>
</beans>

<beans profile="dev">
    <bean id="jobListener" class="com.batch.DevelopmentJobListener"/>
</beans>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接