WLS 9可以說是自WLS 6.0以來最重大的一次改革,不僅增加了許多功能,而且對許多舊有的子系統重新進行了設計。為了集成第三方管理系統,WLS提供了與JMX完全兼容的標準接口來執行所有的管理操作。
在WLS中,每個Domain中使用一系列Mbean負責維護該Domain的配置。這些MBean對內部的各個子系統是樹狀組織形式。對外則提供JMX作為訪問接口。此外還有Console,WLST,WLConfig等管理工具利用Mbean來管理Domain。在WLS 9中完全重寫了JMX子系統,從而代替了從6以來的這部分框架。新的JMX框架支持可靠的批量操作,提高性能,并增加對更多J2EE標準的支持。包括JSR 77,JMX 1.2以及JSR 160等。
此外WLS 9中包含了另一套和JMX類似的API,稱為J2EE Management API,用于實現J2EE Management data model。后面我會通過一個例子對J2EE Management API進行更深入的討論。
本文所有代碼通過WLS 9.0測試,使用Eclipse 3.1.0開發。
本文沒有包括用JMX管理安全Realm和使用自定義MBean。自定義MBean將在另一篇文章中討論。
一.JMX功能介紹
WLS 9中JMX的新特性主要包括如下六方面:
1。由于JMX新版本中遠程API的發布(JSR 160),遠程JMX客戶端可以使用標準的JMX remote API 1.0來訪問WLS上的JMX代理。以前可以通過weblogic.management.MBeanHome接口訪問WLS Mbean的類型安全存根接口。在9中這個接口是不贊成的。如果你的JMX客戶端應用中使用了類型安全接口,建議升級到標準的JMX模型上。但如果使用舊的MBeanHome 接口,仍然可以被新的JMX兼容。
2。新JMX框架中修改Domain配置的過程類似二階段事務提交機制。所有“修改”操作會先臨時保存到Administration Server的Edit MBeans中。然后這些“修改”會發布到各個Server上。如果任何Server不能執行這個修改操作,整個修改過程將回滾。Mbean的發布使用了WLS的部署框架,因此部署和配置使用相同的渠道。
3。新的MBean數據模型。由于整個Domain配置是由一個XML文檔來描述,因此Mbean是以等級結構來表示這個文檔的。每個Domain有一個類型為DomainMBean的MBean來表示這個Domain,該Mbean中又有屬性來訪問Domain的Server和Cluster。當調用一個MBean是通?嗨芆bjectName on =
javax.management.MBeanServerConnection.getAttribute (object-name, attribute);的方法。
4。新的MBean Server結構。Administration Server必須維護三個MBean server,每個Server用于訪問特定種類的Mbean。Edit MBean Server用于訪問Domain中可編輯配置的Mbean;Domain Runtime MBean Server用于訪問該Domain的所有運行時Mbean和只讀配置的Mbean;Runtime MBean Server用于訪問Administration Server的運行時Mbean和只讀配置的Mbean。對于每個授管Server只維護各自的Runtime MBean Server用于訪問該Server上的運行時Mbean和只讀配置的Mbean。JMX客戶端使用J2EE的標準接口
javax.remote.aclearcase/" target="_blank" >ccess來訪問在上述MBean servers上注冊的Mbean。此外還有第四種作為可選的:JVM's platform MBean Sever,用于監控JVM的信息,可存在于Administration Server或被管Server。
5。在WLS 9中,開發者可以把描述應用服務的描述符文件打包到應用的EAR文件中去。因此當部署這個應用時WLS會按照部署描述符文件創建一個實例代表這個服務。因此WLS中許多子系統已經不贊成使用舊的JMX接口轉而升級到新的Mbean。
6。注冊自定義MBean。以前如果需要注冊自定義Mbean,則需要使用自己的Mbean Server或通過weblogic.management.RemoteMBeanServer接口把MBean注冊到WLS的MBean Server上。對于9c除了可以創建自己的MBean Server外,還可以將自定義Mbean注冊到Runtime MBean server上并通過JNDI訪問,或者將自定義Mbean注冊到JVM's platform MBean server上。
二.理解WLS Mbean
按照Mbean是用于監控或配置,分為Runtime MBeans,Configuration MBeans和Configuration MBeans for system modules。Runtime MBeans只包括Server和其資源的運行時狀況,因此只在Server運行期內存活。Configuration MBeans包括Server和其資源的配置,因此保存在Domain的XML配置文檔中。
Configuration MBeans for system modules包括各種系統級Service的配置信息。Domain中每個Server有自己的一份Domain配置文件。當該Server啟動后或者做任何改動時會和Administration Server連絡來更新其配置文件。即使啟動時無法和Administration Server連絡,仍舊可以成功啟動。此外對Administration Server,在Domain的config/pending路經下還有一份可編輯的Domain配置文檔拷貝用于保存JMX client端所作的中間修改狀態。
在WLS中MBean是以樹狀組織的,對應到Domain的XML配置文檔結構。每個Mbean用一個唯一的ObjectName來注冊到MBean Server上。按照約定,子MBean的ObjectName要包含父Mbean的ObjectName中的一部分:
com.bea:Name=name,Type=type[,TypeOfParentMBean=NameOfParentMBean]
[,TypeOfParentMBean1=NameOfParentMBean1]...
其中com.bea是這個Mbean所屬于的JMX Domain名。對于非自定義的MBean,這個Domain Name總是com.bea。此后這些屬性名值對的次序無所謂。JMX允許從本地或遠程訪問MBean Server。如果從本地訪問,JMX客戶端可以通過JNDI獲得javax.management.MBeanServer接口,并還可以訪問創建注冊自定義的MBean。如果遠程訪問需要包含WL_HOME\lib\wljmxclient.jar包,獲得javax.management.MBeanServerConnection接口,但不能操作自定義Mbean。
三.使用JMX的例子
下面用一個例子來說明如何使用JMX訪問Mbean來修改Domain配置。
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.Map;
import javax.management.Attribute;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
public class JMXSample {// JMXSample class definition - do not copy this lineprivate static String USERNAME = "weblogic";
private static String PASSWORD = "weblogic";
private static String PROTOCOL = "t3";
private static String HOSTNAME = "localhost";
private static int PORT = 7001;
private static String JNDI = "/jndi/";
private static String RUNTIME_URI = "weblogic.management.mbeanservers.runtime";
private static String EDIT_URI = "weblogic.management.mbeanservers.edit";
private static String RUNTIME_SERVICE = "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean";
private static String EDIT_SERVICE = "com.bea:Name=EditService,Type=weblogic.management.mbeanservers.edit.EditServiceMBean";
private MBeanServerConnection runtimeServiceConnection = null;
private MBeanServerConnection editServiceConnection = null;
public static void main(String[] args) {JMXSample jmx = new JMXSample();
jmx.runtests();
}//連到特定Server的特定MBean Server上。
//WLS9支持JDK 1.5,所以我這里用上了Tiger的新特性,泛型public MBeanServerConnection getConnection(String URI) throws IOException,MalformedURLException {//描述MBean Server的地址JMXServiceURL serviceURL = new JMXServiceURL(PROTOCOL, HOSTNAME, PORT, JNDI + URI);
Hashtable h = new Hashtable();
h.put(Context.SECURITY_PRINCIPAL, USERNAME);
h.put(Context.SECURITY_CREDENTIALS, PASSWORD);
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
//構造JMXConnector對象。JMXConnector connector = JMXConnectorFactory.connect(serviceURL, (Map)h);
//連接到MBean ServerMBeanServerConnection connection = connector.getMBeanServerConnection();
return connection;
}//包括兩類操作,前面一部分是讀取Domain配置,后面一部分是修改Domain配置。public void runtests() {try {runtimeServiceConnection = getConnection(RUNTIME_URI);
editServiceConnection = getConnection(EDIT_URI);
ObjectName runtimeON = new ObjectName(RUNTIME_SERVICE);
ObjectName editON = new ObjectName(EDIT_SERVICE);
// 獲得 serverObjectName server = (ObjectName) runtimeServiceConnection.getAttribute(runtimeON, "ServerConfiguration");
// 獲得并顯示當前 server 名System.out.println("SERVER NAME "+ runtimeServiceConnection.getAttribute(runtimeON,"ServerName"));
// 獲得并顯示 domain 名ObjectName domain = (ObjectName) runtimeServiceConnection.getAttribute(runtimeON, "DomainConfiguration");
System.out.println("DOMAIN NAME "+ runtimeServiceConnection.getAttribute(domain, "Name"));
// Since we have the server already we will just
原文轉自:http://www.anti-gravitydesign.com