[WLS] Use WLST to Delete All JMS Messages From a Destination

WebLogic Serverに、JMSキューからすべてのメッセージを削除するツールがあるか、という質問を今日もらいましたが、実はWLSのコンソールには、すでにこの機能があります。これは、下の画面のように、宛先の[監視]タブにある[メッセージ表示]ボタンをクリックすると利用できます。

コンソールはアドホックに対応する場合にはいいのですが、自動化したい場合にはどうでしょうか。実は、管理コンソールというのは、JMX管理インターフェースに乗っかっているWebLogic ServerのApplicationの一つです。MBeanリファレンスには、JMSDestinationRuntimeMBeanというMBeanが掲載されています。このMBeanには、引数としてJMS Message SelectorをとるdeleteMessagesオペレーションが含まれています。この引数に空文字を入れると、すべてのメッセージを対象にするワイルドカードとして機能します。

JMSDestinationRuntimeMBean
http://download.oracle.com/docs/cd/E17904_01/apirefs.1111/e13951/mbeans/JMSDestinationRuntimeMBean.html#deleteMessages

JMS Message Selector
http://download.oracle.com/javaee/5/api/javax/jms/Message.html

このためにスタンドアロン JMXクライアントをコーディングするのはあまりエレガントではないので、よりスクリプトに適した方法で実現しましょう。

コンソール以外に、MBeansを参照、起動する別の方法として、JythonベースのWebLogic Scripting Tool (WLST)があります。送信先からメッセージを削除する対話型シェルセッションはこんな感じになります。
D:\Oracle\fmw11gr1ps3\user_projects\domains\hotspot_domain\bin>setDomainEnv.cmd
D:\Oracle\fmw11gr1ps3\user_projects\domains\hotspot_domain>java weblogic.WLST

Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
wls:/offline> connect('weblogic','welcome1','t3://localhost:7001')
Connecting to t3://localhost:7001 with userid weblogic ...
Successfully connected to Admin Server 'AdminServer' that belongs to domain 'hotspot_domain'.
Warning: An insecure protocol was used to connect to the server. To ensure on-the-wire security, the SSL port or Admin port should be used instead.
wls:/hotspot_domain/serverConfig> serverRuntime()
Location changed to serverRuntime tree. This is a read-only tree with ServerRuntimeMBean as the root.
For more help, use help(serverRuntime)
wls:/hotspot_domain/serverRuntime> cd('JMSRuntime/AdminServer.jms/JMSServers/JMSServer-0/Destinations/SystemModule-0!Queue-0')
wls:/hotspot_domain/serverRuntime/JMSRuntime/AdminServer.jms/JMSServers/JMSServer-0/Destinations/SystemModule-0!Queue-0> ls()
dr--   DurableSubscribers
-r--   BytesCurrentCount                            0
-r--   BytesHighCount                               174620
-r--   BytesPendingCount                            0
-r--   BytesReceivedCount                           253548
-r--   BytesThresholdTime                           0
-r--   ConsumersCurrentCount                        0
-r--   ConsumersHighCount                           0
-r--   ConsumersTotalCount                          0
-r--   ConsumptionPaused                            false
-r--   ConsumptionPausedState                       Consumption-Enabled
-r--   DestinationInfo                              javax.management.openmbean.CompositeDataSupport(compositeType=javax.management.openmbean.CompositeType(name=DestinationInfo,items=((itemName=ApplicationName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),(itemName=ModuleName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),(itemNameopenmbean.SimpleType(name=java.lang.Boolean)),(itemName=SerializedDestination,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),(itemName=ServerName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),(itemName=Topic,itemType=javax.management.openmbean.SimpleType(name=java.lang.Boolean)),(itemName=VersionNumber,itemType=javax.management.opule-0!Queue-0, Queue=true, SerializedDestination=rO0ABXNyACN3ZWJsb2dpYy5qbXMuY29tbW9uLkRlc3RpbmF0aW9uSW1wbFSmyJ1qZfv8DAAAeHB3kLZBABZTeXN0ZW1Nb2R1bGUtMCFRdWV1ZS0wAAtKTVNTZXJ2ZXItMAAOU3lzdGVtTW9kdWxlLTABAANBbGwCAlb6IS6T5qL/AAAACgEAC0FkbWluU2VydmVyAC2EGgJW+iEuk+ai/wAAAAsBAAtBZG1pblNlcnZlcgAthBoAAQAQX1dMU19BZG1pblNlcnZlcng=, ServerName=JMSServer-0, Topic=false, VersionNumber=1})
-r--   DestinationType                              Queue
-r--   DurableSubscribers                           null
-r--   InsertionPaused                              false
-r--   InsertionPausedState                         Insertion-Enabled
-r--   MessagesCurrentCount                         0
-r--   MessagesDeletedCurrentCount                  3
-r--   MessagesHighCount                            2
-r--   MessagesMovedCurrentCount                    0
-r--   MessagesPendingCount                         0
-r--   MessagesReceivedCount                        3
-r--   MessagesThresholdTime                        0
-r--   Name                                         SystemModule-0!Queue-0
-r--   Paused                                       false
-r--   ProductionPaused                             false
-r--   ProductionPausedState                        Production-Enabled
-r--   State                                        advertised_in_cluster_jndi
-r--   Type                                         JMSDestinationRuntime
-r-x   closeCursor                                  Void : String(cursorHandle)
-r-x   deleteMessages                               Integer : String(selector)
-r-x   getCursorEndPosition                         Long : String(cursorHandle)
-r-x   getCursorSize                                Long : String(cursorHandle)
-r-x   getCursorStartPosition                       Long : String(cursorHandle)
-r-x   getItems                                     javax.management.openmbean.CompositeData[] : String(cursorHandle),Long(start),Integer(count)
-r-x   getMessage                                   javax.management.openmbean.CompositeData : String(cursorHandle),Long(messageHandle)
-r-x   getMessage                                   javax.management.openmbean.CompositeData : String(cursorHandle),String(messageID)
-r-x   getMessage                                   javax.management.openmbean.CompositeData : String(messageID)
-r-x   getMessages                                  String : String(selector),Integer(timeout)
-r-x   getMessages                                  String : String(selector),Integer(timeout),Integer(state)
-r-x   getNext                                      javax.management.openmbean.CompositeData[] : String(cursorHandle),Integer(count)
-r-x   getPrevious                                  javax.management.openmbean.CompositeData[] : String(cursorHandle),Integer(count)
-r-x   importMessages                               Void : javax.management.openmbean.CompositeData[],Boolean(replaceOnly)
-r-x   moveMessages                                 Integer : String(java.lang.String),javax.management.openmbean.CompositeData,Integer(java.lang.Integer)
-r-x   moveMessages                                 Integer : String(selector),javax.management.openmbean.CompositeData
-r-x   pause                                        Void :
-r-x   pauseConsumption                             Void :
-r-x   pauseInsertion                               Void :
-r-x   pauseProduction                              Void :
-r-x   preDeregister                                Void :
-r-x   resume                                       Void :
-r-x   resumeConsumption                            Void :
-r-x   resumeInsertion                              Void :
-r-x   resumeProduction                             Void :
-r-x   sort                                         Long : String(cursorHandle),Long(start),String[](fields),Boolean[](ascending)
wls:/hotspot_domain/serverRuntime/JMSRuntime/AdminServer.jms/JMSServers/JMSServer-0/Destinations/SystemModule-0!Queue-0> cmo.deleteMessages('')
2
ここで、
  • ドメイン名:hotspot_domain
  • JMSサーバ名:JMSServer-0
  • キュー名:Queue-0
  • システムモジュール名:SystemModule-0
です。オペレーションを呼び出すには、"cmo"オブジェクトを使います。これは”Current Management Object”で現在のMBeanオブジェクトを意味します。最後の2は2件のメッセージが削除されたことを示しています。
このWLSTコードと、最近同僚のSteveが書いたエントリにある、暗号化されたファイルを使って認証資格情報を格納する方法を組み合わせれば、簡単にセキュアな自動スクリプトにすることができるでしょう。もしこの手順でわからないことがあれば、WLSTの基礎に関するかなり前のエントリを参考にしてください。

参考URL
Steveのエントリ
Using Secure Config Files with the WebLogic Maven Plugin
http://buttso.blogspot.com/2011/02/using-secure-config-files-with-weblogic.html

過去のエントリ
Automate WLS Console Tasks with WLST
http://blogs.oracle.com/jamesbayer/2007/10/automate_wls_console_tasks_wit.html


原文はこちら。
http://blogs.oracle.com/jamesbayer/2011/03/use_wlst_to_delete_all_jms_mes.html

0 件のコメント:

コメントを投稿