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是通?类似objectname 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.access来访问在上述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
闽公网安备 35060202000074号