spring - 将 jndi 数据源与 Spring Batch 管理一起使用

标签 spring spring-batch spring-batch-admin

使用 Spring Batch Admin 时,它会尝试为 dataSource、transactionManager 等提供一些默认值。

如果您想覆盖这些默认值,您可以在 META-INF/spring/batch/servlet/override/ 文件夹下创建自己的 xml bean 定义,并且在引导过程中它保证默认属性将被覆盖。

在 spring-batch-admin 中,dataSource 默认值是在 data-source-context.xml 中使用此定义定义的

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${batch.jdbc.driver}" />
    <property name="url" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />
    <property name="password" value="${batch.jdbc.password}" />
    <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/>
    <property name="validationQuery" value="${batch.jdbc.validationQuery}"/>
</bean>

现在,我想用 JNDI 数据源覆盖此数据源,因此我删除了诸如 batch.jdbc.driverbatch.jdbc.url 之类的属性行,并拥有以下 jndi 定义

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName" value="java:comp/env/jdbc/dbconn" />
</bean> 

正如您可能很容易猜到的那样,系统首先尝试初始化 data-source-context.xml 中定义的 dataSource bean,并且由于它找不到属性值batch.jdbc.* 的任何值,因此会失败并出现异常。

Could not resolve placeholder 'batch.jdbc.driver' in string value [${batch.jdbc.driver}]

由于我将使用 JNDI 并且不想处理这些属性值,因此无法继续。

关于如何在这种情况下覆盖数据源有什么想法吗?

最佳答案

在 Spring Batch Admin 中,正在加载 2 个 Spring ApplicationContext:

  • servlet-config.xml
  • webapp-config.xml

servlet-config.xml 具有以下导入:

<import resource="classpath*:/META-INF/spring/batch/servlet/resources/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/servlet/manager/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/servlet/override/*.xml" />

webapp-config.xml 具有以下导入:

<import resource="classpath*:/META-INF/spring/batch/bootstrap/**/*.xml" />
<import resource="classpath*:/META-INF/spring/batch/override/**/*.xml" />

servlet-config.xml 配置 servlet,webapp-config.xml 配置应用程序(后端部分)。 问题是 dataSource bean 是第二个配置的一部分/定义在第二个配置中,而不是第一个配置中。 因此,当您将 dataSource bean 添加到 servlet 配置(/META-INF/spring/batch/servlet/override/*.xml)的覆盖时,正如您所做的那样,您将一个新 bean 添加到第一个上下文中,而不是覆盖第二个上下文的 dataSource bean。

因此,您需要将自定义 data-source-context.xml 放在 META-INF/spring/batch/override/下,而不是 META-INF/spring/batch/servlet/override/

然后它就可以工作,您甚至不会收到无法解析字符串值[${batch.jdbc.driver}]中的占位符'batch.jdbc.driver'错误。

关于spring - 将 jndi 数据源与 Spring Batch 管理一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16062922/

相关文章:

java - Spring Batch - XML 到 DB - 如何始终为多次运行提供新鲜数据(无论 XML 文件中存在什么)?

java - 为 Spring Batch 应用程序中的所有作业保持相同的 block 大小

java - 使用 Spring 批处理处理大文件的最佳方法

java - 不同 RDBMS 上的 NamedParameterJDBCTemplate 和函数语法

java - 如何将 java/resources 文件获取到 InputStream?

具有两个休眠事务的 spring junit 测试

java - 使用分区器时没有上下文持有者

java - Spring 批处理 : different job launcher for different jobs

java - 覆盖 spring validator 中的错误消息