weblogic.jms.extensions.JMSModuleHelper
を使用して、JMSサーバー、ストア・アンド・フォワード・エージェントおよびJMSシステム・リソースをプログラム的に作成および管理する方法について説明します。
JMSModuleHelper
は、システム・モジュールやJMSリソース(キュー、トピックなど)の管理に使用する以下のAPIシグネチャを提供します。
リソースの作成
リソースの作成と変更
リソースの削除
リソースの検索と変更
テンプレートを使用した検索
システム・モジュールとそれに含まれるJMSリソースを管理するには、ドメインMBeanを提供するか、API署名内の管理サーバーに初期コンテキストを提供します。JMSシステム・リソースの詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプの基本JMSシステム・リソースの構成に関する項を参照してください。
JMSModuleHelper
は、JMSサーバーとストア・アンド・フォワード・エージェントの管理に使用する次のメソッドAPIを提供します。
JMSサーバーとストア・アンド・フォワード・エージェントの作成
JMSサーバーとストア・アンド・フォワード・エージェントの削除
JMSサーバーとストア・アンド・フォワード・エージェントのデプロイメント
JMSサーバーとストア・アンド・フォワード・エージェントのアンデプロイメント
JMSサーバーとストア・アンド・フォワード・エージェントを管理するには、ドメインMBeanを提供するか、APIシグネチャ内の管理サーバーに初期コンテキストを提供します。詳細については、以下を参照してください。
Oracle WebLogic Server管理コンソール・オンライン・ヘルプの基本JMSシステム・リソースの構成に関する項。
Oracle WebLogic Server管理コンソール・オンライン・ヘルプのストア・アンド・フォワード・サービスの理解に関する項。
この項では、JMSシステム・リソース・モジュールを作成および削除するサンプル・コードを示します。次のトピックが含まれます。
このモジュールには、接続ファクトリとトピックが含まれています。
例8-1に、JMSシステム・リソースの作成方法を示します。
例8-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システム・リソースを削除します。
例8-2に、JMSシステム・リソースの削除方法を示します。
例8-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(); } } . . .
WebLogic Server 10.3.6以降では、JMSModuleHelperは、既存のWebLogicセキュリティ・モデルに準拠する匿名のルックアップ(-Dweblogic.management.anonymousAdminLookupEnabled=true
を使用)をサポートしません。
アプリケーション環境が匿名ユーザーの使用に依存している場合、匿名用のセキュリティ・ロールを作成し、そのロールのユーザーによるアクセスを許可するポリシーをJNDIリソースweblogic.management.mbeanservers
に適用できます。『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のWebLogic Server MBeanのセキュリティに関する項を参照してください。
この項では、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);