Spring Batch CommandLineRunner с несколькими файлами конфигурации bean-компонентов

Я пишу приложение Spring Batch и разделил конфигурацию Spring Beans на несколько файлов;

  • batch / launchContext.xml (JobLauncher / JobRepository и т. д.)
  • batch / common.xml (общие компоненты используются во всех заданиях)
  • dataSource.xml (источник данных)
  • batch / jobs / myJob.xml (отдельные файлы для вакансий)

Причина этого в том, что я хочу, чтобы источник данных менялся между настройками разработки / тестирования / производства, а также чтобы сохранить повторную запись одних и тех же определений bean-компонентов снова и снова.

Проблема заключается в том, что я хочу запустить приложение Spring Batch. При чтении инструкций здесь http://static.springsource.org/spring-batch/reference/html/configureJob.html#runningJobsFromCommandLine предполагает наличие одного файла конфигурации Spring для каждого задания, но я не хочу этого делать.

Как я могу запустить задание Spring Batch из командной строки, которое использует несколько файлов конфигурации bean-компонентов?


person johnmmcparland    schedule 23.10.2012    source источник


Ответы (1)


Вы всегда можете просто импортировать контексты:

So in batch/jobs/myJob.xml:

<import resource="batch/launchContext.xml" />
<import resource="batch/common.xml" />
<import resource="dataSource.xml" />

См. Также в Spring Документы

РЕДАКТИРОВАТЬ:

Вы можете использовать заполнитель свойств для экстернализации определений свойств источника данных:

В вашем dataSource.xml:

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder 
   location="classpath:com/foo/jdbc.properties" 
   systemPropertiesMode="2" />  <!-- 2 means override -->

Ваш jdbc.properties будет содержать значения по умолчанию:

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

но поскольку используется режим "переопределения" системных свойств, их можно указать во время выполнения:

java -Djdbc.url=jdbc:hsqldb:hsql://dev:9002 ...

См. Также здесь

person beny23    schedule 23.10.2012
comment
Да, это сработает. Единственное, что меня беспокоит, это то, что я не могу настроить источник данных во время выполнения. Это особенно важно для настройки различных установок для разработки, тестирования и производства. - person johnmmcparland; 23.10.2012
comment
да, это работает, когда вы хотите разместить свойства в файле ... но не тогда, когда источник данных может быть на самом деле основанным на JNDI или локальным тестовым. В первом случае определение выглядит несколько иначе и поэтому не может быть параметризовано. Тем не менее, я отметил ваш ответ, поскольку могу использовать системную переменную для выбора соответствующего файла dataSource.xml. - person johnmmcparland; 23.10.2012