私のWebサービスは、JBoss AppServerまたはWebsphereAppServerで実行されます。どちらの場合もインスタンス名を知る必要があります。Jbossの場合はSystem.getProperty("jboss.server.name"),
を使用できますが、WebSphereには何を使用できますか? WebSphere固有のメソッドを使用できません。System.propertiesを呼び出す必要があります
ありがとう
プラットフォームをニュートラルに保つために、WebsphereサーバーのJVM引数として変数を設定できます(クラスター化されている場合はノードごとに1つ)。 Websphere 7の場合、管理コンソールに次のように表示されます...
Servers > Server Types > Websphere application servers > [your cluster node] >
> Java and Process Management > Process Definition > Java Virtual Machine >
> Generic JVM arguments
このような変数を追加します...
-DServerName=serverNodeA
次に、コード内の値に次のようにアクセスできます...
String serverName = System.getproperty("ServerName");
この手法は、JVMに引数を追加するためのアクセス権がある限り、すべてのアプリケーションサーバーで使用できます。ノード名を照会するには、Websphere固有のAPIが必要であると確信していますが、サーバーにコードを入力しているため、単体テストが難しく、移植性がありません。私はこのアプローチを好みます。
少なくともWebSphereの場合の代替手段は、JNDIツリーで検索することです。これは私が使用するものです:
InitialContext ic = new javax.naming.InitialContext();
String serverName = ic.lookup("servername").toString();
このように、WebSphereがその情報をバインドするので、何も構成する必要はありません。
セル名とノード名は、「thisNode/cell/cellname」と「thisNode/nodename」を使用して取得することもできます。クラスターで役立つもの。
kurtcebeソリューションはうまく機能します。 Mavenを使用している場合は、jarファイルをプロジェクトに簡単に組み込むことはできません。このため、Class.forname ..を使用してください。
try {
Class<?> c = Class.forName("com.ibm.websphere.runtime.ServerName");
LOGGER.debug("Class found" + c);
Method m = c.getMethod("getFullName", new Class<?>[0]);
LOGGER.debug("Method found" + m);
Object o = m.invoke(DeliveryServiceUtils.class, new Object[0]);
LOGGER.debug("Method invoked, response is " + o);
processName = o.toString();
}
catch (Exception ex) {
processName = "unknown - " + ex.getClass().getName() + ": " + ex.getMessage();
}
ブラッドによって提案されたアプローチは良いですが、私はそれを微妙に異なる方法で行います。
サーバーJVMのカスタムプロパティで、プロパティServer-Nameを追加し、その値をWAS_SERVER_NAMEとして指定します。
これがこのためのパン粉です:
サーバー->->プロセス定義-> Java仮想マシン>カスタムプロパティ
値が$ {WAS_SERVER_NAME}のServerNameを使用して新しいものを追加します
すべてのWASサーバーインスタンスでは、このWebSphere変数がサーバーインスタンスの名前に設定されています。タイプミス(またはここで同様のエラー)を心配する必要はありません。このアプローチはすべてのWASサーバーで機能します。
このような値をテンプレートとして設定してサーバーを作成できます。新しいサーバーを作成すると、これらの値が常に表示されます。
HTH