2016-12-08 9 views
1

私は春のバッチアプリケーションを持っています。アプリケーションのcontext.xmlでプログラムでXMLで値を変更する方法

:database.xmlで

<!-- stored job-meta in database - H2 --> 
    <bean id="jobRepository" 
     class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
     <property name="dataSource" ref="dataSourceMetaData" /> 
     <property name="transactionManager" ref="transactionManager" /> 
     <property name="databaseType" value="h2" />  
    </bean> 

:スプリングのバッチジョブのメタデータを格納するために使用されるデータベースは、次のように構成されている

<!-- configure H2 database connection --> 
<bean id="dataSourceMetaData" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:~/metaDataProd" /> 
</bean> 

これで、アプリケーションは複数のインスタンスで同じ環境で実行できます.1つのインスタンスはprod &の1つのインスタンスです。だから私は両方のインスタンスが同じdbにアクセスしないようにvalue="jdbc:h2:~/metaDataProdを設定する必要があります。

私は設定ファイルから値を生成すると簡単に行うことができます。しかし、私はこれを行うための自動方法があるかどうか疑問に思っています。例:アプリケーションインスタンスが、その後開始されるとDATEVALUEは、あなたがPropertySourcesPlaceholderConfigurerを使用して、環境変数、外部のプロパティファイルまたは同様のように、さまざまなソースからの値を初期化することができ、このvalue="jdbc:h2:~/metaData2Julvalue="jdbc:h2:~/metaData4Jul

+0

あなたは今仕事を開始していますか? –

+0

ジョブはシェフを使用して配備されています。現在、私は 'value =" $ {url} "'を入れて、環境ごとにプロパティファイルにurl値を変更するという手作業でアプローチしています。私はそれを自動化したい。 – Ajit

+0

シェフから春のバッチにparamを渡すことはできますか? –

答えて

1

のようなプログラムで味方を付加されます。次に、ハードコードされた値の代わりに$ {propname}プレースホルダを使用します。

related qeustionも参照してください。

インスタンスを区別する必要はなく、異なるインスタンスにする必要がある場合は、SpELという非常に簡単な方法があります。あなたがspring.xmlやアプリケーションを制御することはできませんが、いくつかを実行することができる場合

<property name="url" value="#{ 'jdbc:h2:~/metaData' + T(java.lang.System).nanoTime() }" /> 

または

<property name="url" value="#{ 'jdbc:h2:~/metaData-' + T(java.util.UUID).randomUUID() }" /> 

または

<property name="url" value="#{ 'jdbc:h2:~/metaData-' + (new java.text.SimpleDateFormat('ddmm_hh_mm_ss')).format(new java.util.Date()) }" /> 

:以下のいずれかの作業を行うことができますスクリプトで名前を生成し、xmlのjdbc urlの値を置き換えることができます(スクリプト言語に応じて、ここでは無限の解決策があります)。

+0

私はこのアプローチを知っている&それは私が質問で言及したものです。私がそうするなら、それは自動アプローチではありません。むしろ、アプリケーションの別のインスタンスの設定ファイルの値を手動で変更する必要があります。とにかくあなたの素早い応答のためにありがとう:) – Ajit

+0

私の答えは、構成ファイルを手動で編集することについて何も言わない。変数を参照し、インスタンスのハードコードされた値を設定しないで、プレースホルダを構成に一度だけ置きます。その後、必要に応じてさまざまな方法でパラメータを配線してインスタンスを開始できます。最も単純な例は、開始コマンドラインで '-Dname = value'パラメータを追加することによってプロパティ値をインスタンスに渡すことです。値には日時のシェル式または変数を含めることができます(これは準備する_single_コマンドです。各インスタンスごとに)。 – Dreamer

+0

私はこのアプローチとそのプロセスを自動化する良い方法についても考えてきました。しかし、アプリケーションがシェフ経由で配備されると、他のチームのコード変更やヘルプが必要になります。 – Ajit

0

あなたはそのためのJNDIプロパティを指定し、init uisngのInitialContext()メソッドでそのプロパティを読み込むことができ、このようないくつか:

new InitialContext(environment).lookup(myServiceJndiName); 

そして、あなたは、このケースのテストENVに異なる環境に異なるJNDI値を指定することができますまたは生産環境。

関連する問題