7 JMSモジュール・ヘルパーを使用したアプリケーションの管理
JMSModuleHelperを使用して、JMSサーバー、ストア・アンド・フォワード・エージェントおよびJMSシステム・リソースを作成および管理する方法を学習します。
JMSModuleHelperを使用したJMSシステム・リソースの構成
システム・モジュールとそれに含まれるJMSリソースを管理するには、ドメインMBeanを提供するか、JMSModuleHelperクラスによって定義されたAPIシグネチャ内の管理サーバーに初期コンテキストを提供します。
JMSModuleHelper クラスは、システム・モジュールやJMSリソース(キュー、トピックなど)の管理に使用する、次のAPIシグネチャを提供します。
-
リソースの作成
-
リソースの作成と変更
-
リソースの削除
-
リソースの検索と変更
-
テンプレートを使用した検索
『Oracle WebLogic Server JMSリソースの管理』の基本JMSシステム・リソースの構成に関する項を参照してください。
JMSサーバーとストア・アンド・フォワード・エージェントの構成
JMSサーバーとストア・アンド・フォワード・エージェントを管理するには、ドメインMBeanを提供するか、JMSModuleHelperクラスによって定義されたAPIシグネチャ内の管理サーバーに初期コンテキストを提供します。
JMSModuleHelperクラスは、JMSサーバーとストア・アンド・フォワード・エージェントの管理に使用する、次のメソッドAPIを提供します。
-
JMSサーバーとストア・アンド・フォワード・エージェントの作成
-
JMSサーバーとストア・アンド・フォワード・エージェントの削除
-
JMSサーバーとストア・アンド・フォワード・エージェントのデプロイメント
-
JMSサーバーとストア・アンド・フォワード・エージェントのアンデプロイメント
関連項目
-
『Oracle WebLogic Server JMSリソースの管理』の基本JMSシステム・リソースの構成に関する項。
-
『Oracle WebLogic Server JMSリソースの管理』のストア・アンド・フォワード・サービスの理解に関する項。
JMSModuleHelperのサンプル・コード
サンプル・コード内の説明に従って、JMSシステム・リソース・モジュールを作成および削除する方法を学習します。
JMSシステム・リソースの作成
このモジュールには、接続ファクトリとトピックが含まれています。
例7-1に、JMSシステム・リソースの作成方法を示します。
例7-1 JMSシステム・リソースの作成
.
.
.
private static void createJMSUsingJMSModuleHelper(Context ctx){
System.out.println(
"\n\n.... Configure JMS Resource for C API Topic Example ....\n\n");
try {
MBeanHome mbeanHome =
(MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
DomainMBean domainMBean = mbeanHome.getActiveDomain();
String domainMBeanName = domainMBean.getName();
ServerMBean[] servers = domainMBean.getServers();
String jmsServerName = "examplesJMSServer";
//
// create a JMSSystemResource "CapiTopic-jms"
//
String resourceName = "CapiTopic-jms";
JMSModuleHelper.createJMSSystemResource(
ctx,
resourceName,
servers[0].getName());
JMSSystemResourceMBean jmsSR =
JMSModuleHelper.findJMSSystemResource(
ctx,
resourceName);
JMSBean jmsBean = jmsSR.getJMSResource();
System.out.println("Created JMSSystemResource " + resourceName);
//
// create a JMSConnectionFactory "CConFac"
//
String factoryName = "CConFac";
String jndiName = "CConFac";
JMSModuleHelper.createConnectionFactory(
ctx,
resourceName,
factoryName,
jndiName,
servers[0].getName());
JMSConnectionFactoryBean factory = jmsBean.lookupConnectionFactory(factoryName);
System.out.println("Created Factory " + factory.getName());
//
// create a topic "CTopic"
//
String topicName = "CTopic";
String topicjndiName = "CTopic";
JMSModuleHelper.createTopic(
ctx,
resourceName,
jmsServerName,
topicName,
topicjndiName);
TopicBean topic = jmsBean.lookupTopic(topicName);
System.out.println("Created Topic " + topic.getName());
} catch (Exception e) {
System.out.println("Example configuration failed :" + e.getMessage());
e.printStackTrace();
}
}
.
.
.JMSシステム・リソースの削除
次のコードは、JMSシステム・リソースを削除します。
例7-2に、JMSシステム・リソースの削除方法を示します。
例7-2 JMSシステム・リソースの削除
.
.
.
private static void deleteJMSUsingJMSModuleHelper(Context ctx ) {
System.out.println("\n\n.... Remove JMS System Resource for C API Topic Example ....\n\n");
try {
MBeanHome mbeanHome =
(MBeanHome) ctx.lookup(MBeanHome.ADMIN_JNDI_NAME);
DomainMBean domainMBean = mbeanHome.getActiveDomain();
String domainMBeanName = domainMBean.getName();
ServerMBean[] servers = domainMBean.getServers();
String jmsServerName = "examplesJMSServer";
//
// delete JMSSystemResource "CapiTopic-jms"
//
String resourceName = "CapiTopic-jms";
JMSModuleHelper.deleteJMSSystemResource(
ctx,
resourceName
);
} catch (Exception e) {
System.out.println("Example configuration failed :" + e.getMessage());
e.printStackTrace();
}
}
.
.
.匿名ユーザーのセキュリティの考慮事項
アプリケーション環境が匿名ユーザーの使用に依存している場合、匿名用のセキュリティ・ロールを作成し、そのロールのユーザーによるアクセスを許可するポリシーをJNDIリソースweblogic.management.mbeanserversに適用できます。
『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のWebLogic Server MBeanのセキュリティに関する項を参照してください。
WebLogic Server 10.3.6以降では、JMSModuleHelperは、既存のWebLogicセキュリティ・モデルに準拠する匿名のルックアップ(-Dweblogic.management.anonymousAdminLookupEnabled=trueを使用)をサポートしません。
JMSModuleHelper使用時のベスト・プラクティス
JMSModuleHelperクラスを使用してJMSサーバーおよびリソースを構成するときのベスト・プラクティスについて説明します。
-
MBeanオブジェクトを操作する前に、Null MBeanオブジェクト(サーバー、JMSサーバー、モジュールなど)をトラップします。
-
メソッド呼出しの作成または削除は、例外をスローせずに失敗する可能性があります。また、例外がスローされても、それが必ずしもメソッド呼出しの失敗を示しているとは限りません。
-
JMSサーバーでの宛先の作成とJNDIネームスペースへの情報の伝播には、時間がかかる場合があります。複数のサーバーを使用している環境では、伝播の遅延が増大します。JNDIルックアップを実行するよりも、
createQueue()メソッドまたはcreateTopic()メソッドを使用して、それぞれキューまたはトピックの存在をテストすることをお薦めします。この方法によって、伝播固有の遅延を、ある程度回避できます。たとえば、次に示す
findQueue()メソッドは、動的に作成されたキューにアクセスしようとしますが、アクセスに失敗すると再試行まで、指定された間隔スリープします。無限ループを回避するために、再試行の最大回数が設定されています。
private static Queue findQueue (
QueueSession queueSession,
String jmsServerName,
String queueName,
int retryCount,
long retryInterval
) throws JMSException
{
String wlsQueueName = jmsServerName + "/" + queueName;
String command = "QueueSession.createQueue(" +
wlsQueueName + ")";
long startTimeMillis = System.currentTimeMillis();
for (int i=retryCount; i>=0; i--) {
try {
System.out.println("Trying " + command);
Queue queue = queueSession.createQueue(wlsQueueName);
System.out.println(command + "succeeded after " +
(retryCount - i + 1) + " tries in " +
(System.currentTimeMillis() - startTimeMillis) +
" millis.");
return queue;
} catch (JMSException je) {
if (retryCount == 0) throw je;
}
try {
System.out.println(command + "> failed, pausing " +
retryInterval + " millis.");
Thread.sleep(retryInterval);
} catch (InterruptedException ignore) {}
}
throw new JMSException("out of retries");
}
この場合、JMSModuleHelperクラス・メソッドの後にfindQueue()メソッドを呼び出すことで、動的に作成されたキューを使用可能になり次第、取り出すことができます。たとえば:
JMSModuleHelper.createPermanentQueueAsync(ctx, domain, jmsServerName, queueName, jndiName); Queue queue = findQueue(qsess, jmsServerName, queueName, retry_count, retry_interval);