2013-04-17 15 views
7

Quando si utilizza Primavera Batch Admin, si cerca di fornire alcuni valori di default per dataSource, transactionManager eccUtilizzando datasource JNDI con molla lotto di amministrazione

Se si desidera ignorare queste impostazioni predefinite, è possibile creare le proprie definizioni XML di fagioli sotto META -INF/spring/batch/servlet/override/ cartella e durante il bootstrap garantisce che le proprietà di default saranno sovrascritte.

In primavera-batch-admin, un default dataSource è definito in origine dati-context.xml con questa definizione

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

Ora, voglio ignorare questo dataSource con un DataSource JNDI così ho tolto il linee di proprietà come batch.jdbc.driver, batch.jdbc.url e hanno la seguente definizione jndi

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

Come si può facilmente intuire il sistema tenta prima di inizializzare il fagiolo dataSource definito nei dati source-context.xml e dal momento che non riesce a trovare alcun valore per p roperty valori batch.jdbc. * fallisce con un'eccezione.

Impossibile risolvere segnaposto 'batch.jdbc.driver' in valore stringa [$ {} batch.jdbc.driver]

Dato che io sarò con JNDI e non voglio a che fare con questi valori di proprietà, non posso procedere.

Qualche idea su come sovrascrivere dataSource in questa situazione?

+0

Ciao- hai trovato una soluzione? (Non voglio usare i profili solo per questo problema.) – dsatish

+0

@sdny No. Prova anche a usare una soluzione senza profili. –

+0

Ho incontrato lo stesso problema. Anche impostando una connessione "predefinita" funzionante usando le proprietà richieste, non ero in grado di ottenere l'override dataSource da utilizzare. – Eric

risposta

6

Da Spring Batch Admin, ci sono 2 ApplicationContexts sorgente che vengono caricati:

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

servlet-config.xml trovi queste importazioni:

<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 ha queste importazioni:

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

servlet-config.xml con i configuratori il servlet, webapp-config.xml configura (la parte backend del) l'applicazione. Il problema è che il bean dataSource è parte di/defined nella seconda configurazione, non nella prima. Quindi, quando si aggiunge il bean DataSource a un override per la configurazione del servlet (/ META-INF/spring/batch/servlet/override/*. Xml), come si fa, si aggiunge un nuovo bean al primo contesto, invece di sovrascrivere il bean DataSource del secondo contesto.

Quindi, è necessario mettere il vostro data-source-context.xml personalizzato sotto META-INF/primavera/batch/esclusione/invece di META-INF/primavera/batch/servlet/esclusione/

Quindi funziona e non avrai nemmeno l'errore Could not resolve placeholder 'batch.jdbc.driver' in string value [${batch.jdbc.driver}].

+0

Puoi pubblicare il contenuto del file di contesto che aggiunto a META-INF/spring/batch/override? – emeraldjava

+0

Ho copiato env-context.xml in /batch/override/manager/env-context.xml e modificato classpath: batch - $ {ENVIRONMENT: hsql} .properties a classpath: batch-mysql.properties ma è non funziona – vishal

+0

Puoi confermare se hai aggiunto questo alla cartella principale o webapps del tuo progetto maven? Ho dovuto spostare il contesto nella cartella principale come da questa discussione. http://forum.spring.io/forum/spring-projects/batch/84070-spring-batch-admin-db-connection-by-datasource – emeraldjava

3

dalla primavera 3.1 c'è la funzione di 'profili', che consente di impostare il DataSource 'fonte' in base all'ambiente siete in. (Un uno incorporato per il test locale, un JNDI uno per la distribuzione.)

questo sarebbe simile al seguente;

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <!-- "production" datasource --> 
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/dbconn"/> 

    <!-- profile for "local" testing --> 
    <beans profile="local"> 
      <!-- datasource that only gets created in that active profile --> 
     <jdbc:embedded-database id="dataSource" type="H2"/> 
    </beans> 


</beans> 

in questo esempio, quando il 'profilo attivo' è impostato su "locale", sovrascrive l'origine dati jndi-ricerca.

Problemi correlati