4

Websphereのアプリケーション レベルで環境変数を設定することは可能ですか?

Websphere サーバーは、複数のアプリケーションをホストできます。サーバー レベルで適用される環境変数は、そのサーバー上のすべてのアプリケーションに適用されます。個々のアプリケーションにのみ適用される変数を作成することはできますか?

例: SpreadsheetAppDocsAppが同じサーバーで実行されているとします。どちらも、 DocStorageLocationという環境変数を介して構成できるいくつかの共通コードを共有しています。両方のアプリケーションで異なるDocStorageLocationを設定することは可能ですか?

または、同じサーバーで実行されている複数のアプリケーションを構成する別の方法はありますか?

4

1 に答える 1

7

質問1

両方のアプリケーションで異なる DocStorageLocation を設定することは可能ですか?

私はそれが可能だとは思わない。Websphere の環境変数は、サーバー自体によって使用されることを意図しています。変数には、サーバー、クラスター、およびノー​​ドの 3 つのスコープしかありません。

たとえば、server1 のORACLE_JDBC_DRIVER_PATH環境変数、node1スコープは、 node1の JDBC プロバイダーに使用できます(classPath = ${ORACLE_JDBC_DRIVER_PATH}/ojdbc14.jar)。

問題は、「自分のアプリケーションだけに別の値を設定できないのはなぜですか」ということです。しかし、私の推測では、サーバー、クラスター、およびノー​​ドが開始されている限り、デプロイされたアプリケーションに対してこの値をオーバーライドしても意味がありません。

無理だとは思いますが、やってみました。しかし、websphere サーバーに設定された環境変数をオーバーライドすることはできませんでした。

質問2

または、同じサーバーで実行されている複数のアプリケーションを構成する別の方法はありますか?

環境エントリー

検索可能な変数である web.xml デプロイメント記述子に、環境エントリを追加できます。

<env-entry>
    <env-entry-name>DocStorageLocation</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:/DocStorage</env-entry-value>
</env-entry>

次に、テストし、Java クラスでこの変数を検索します。

//TEST
Object l_test = null;
try {
    Context l_ctx = new InitialContext();
    l_test = l_ctx.lookup("java:comp/env/DocStorageLocation");
} catch (NamingException e1) {
    // TODO
    e1.printStackTrace();
}

.properties ファイルの URL リソース

URL リソースを作成できます。ローカル ホストまたは任意のサーバーに設定された .properties ファイルにリンクされるため、環境に応じて各プロパティを異なる値に設定できます。

たとえば、JNDI 名はurl/environmentJndiNameで、値は server1 では file:///server1/environment.properties、server2 では file:///server2/environment.properties です

次に、サーバー 1で、environment.properties ファイルでdocStorageLocation=value1を設定し、サーバー 2 でdocStorageLocation=value2を設定できます。

デプロイメント記述子 web.xml では、リソースの参照は同じになります。Java ソースでこの参照を変更する必要はありません。

   <resource-ref>
         <res-ref-name>url/environment</res-ref-name>
         <res-type>java.net.URL</res-type>
         <res-auth>Application</res-auth>
         <res-sharing-scope>Shareable</res-sharing-scope>
   </resource-ref>

次に、このリソースを使用してプロパティを読み取ります。

try {
    Context l_ctx = new InitialContext();
    URL l_url = (URL) l_ctx.lookup("java:comp/env/url/environment");
    // New properties
    Properties l_properties = new Properties();
    // Load properties
    this.loadProps(l_properties, l_url.getPath());

} catch (NamingException e1) {
    // TODO
    e1.printStackTrace();
} catch (IOException e) {
    // TODO Bloc catch auto-généré
    e.printStackTrace();
}

    ...

private void loadProps(final Properties p_properties, final String p_fileLocation)
    throws IOException
{
    // Open stream
    BufferedInputStream l_is = new BufferedInputStream(
            new FileInputStream(
                    new File(p_fileLocation)));

    p_properties.load(l_is);
    // Close stream
    l_is.close();
}

web.xml のリソース参照URL/環境を、Websphere サーバー上のこのリソースに設定された JNDI 名url/environmentJndiNameにバインドする必要があります。ibm-web-bnd.xml ファイルを websphere で、sun-web.xml ファイルを glassfish で、などに変更します。

ありがとう

より良い解決策がある場合、または質問に対する回答がない場合は、お知らせください。私はまだ学んでいますが、他のソリューションを好む場合でも、しばらく websphere を使用しています。@+さん、ありがとうございます。

于 2013-04-17T13:45:14.930 に答える