选择显示字体大小

weblogic server 9.0 应用的配置管理接口

weblogic server 9.0 应用的配置管理接口

作者:goblinize


版权申明:转载务必保留以下申明和链接:
作者:goblinize
原文地址:
http://www.matrix.org.cn/blog/goblinize

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.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 line
private 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 server
mbeanserverconnection 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);

// 获得 server
objectname 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 reuse it to
// 获得并显示当前监听端口
system.out.println("listen port "
+ runtimeserviceconnection.getattribute(server,
"listenport").tostring());
// 获得并显示ssl端口
objectname ssl = (objectname) runtimeserviceconnection
.getattribute(server, "ssl");
system.out.println("ssl listen port "
+ runtimeserviceconnection.getattribute(ssl, "listenport")
.tostring());
// 获得并显示生产模式
system.out.println("production mode enabled "
+ runtimeserviceconnection.getattribute(domain,
"productionmodeenabled").tostring());
//获得并显示当前部署的所有应用
objectname[] apps = (objectname[]) runtimeserviceconnection
.getattribute(domain, "appdeployments");
for (objectname app : apps) {
system.out.println("app deployment : "
+ runtimeserviceconnection.getattribute(app, "name")
.tostring());
}

objectname mgron = (objectname) editserviceconnection.getattribute(
editon, "configurationmanager");
//对edit mbean的事务控制包括startedit,save,activate等。这些方法都必须通过类反射来执行。
//第一个参数表示如果调用startedit时候等待获得锁的时间。第二个参数表示如果2分钟之内没完成所有操作,则自动失去锁。
object[] params = new object[] { new integer(60000),
new integer(120000) };
string[] paramtypes = new string[] { "java.lang.integer",
"java.lang.integer" };
//start edit将返回一个domain mbean的句柄,可认为是整个配置树的根。
objectname domainmgr = (objectname) editserviceconnection.invoke(mgron,
"startedit", params, paramtypes);
if (domainmgr == null) {
// 无法在规定时间内获得锁
throw new exception("somebody else is editing already");
}
//对domain mbean的notes属性做一个修改
attribute notes = new attribute("notes", "blah blah blah");
editserviceconnection.setattribute(domainmgr, notes);
//列出未保存的修改
object[] unsavedlist = (object[])editserviceconnection.getattribute(mgron, "changes");
for(object o:unsavedlist)
system.out.println("unsaved change: " + o.tostring());
//如果不保存,则可执行"undo"操作
editserviceconnection.invoke(mgron, "save", null, null);
//列出未激活的修改
object[] unactivatedlist = (object[])editserviceconnection.getattribute(mgron, "changes");
for(object o:unactivatedlist)
system.out.println("unactivated change: " + o.tostring());
//激活这个修改
params = new object[]{new long(120000)};
paramtypes = new string[]{"java.lang.long"};
objectname taskon =
(objectname) editserviceconnection.invoke(mgron, "activate", params, paramtypes);
//列出已经激活的修改
object[] activatedlist=(object[])editserviceconnection.getattribute(taskon, "changes");
for(object o:activatedlist)
system.out.println("activated change: " + o.tostring());
//最近激活的任务。wls默认保存最近10笔激活的任务历史
for(object o:activatedlist)
system.out.println("activated change: " + o.tostring());
objectname[] completedobjects=(objectname[])editserviceconnection.getattribute(mgron,
"completedactivationtasks");
for(objectname on:completedobjects){
system.out.println("user who started activation: " +editserviceconnection.getattribute(on, "user"));
system.out.println("task state:" +editserviceconnection.getattribute(on, "state"));
system.out.println("start time:" +editserviceconnection.getattribute(on, "starttime"));
object[] completedlist=(object[])editserviceconnection.getattribute(on, "changes");
for(object o:completedlist)
system.out.println("changes activated: " + o.tostring());
}
//清除已经完成的激活的任务
editserviceconnection.invoke(mgron, "purgecompletedactivationtasks", null, null);
// 由于edit属性是异步的,在此我们等待操作完成。
params = new object[]{new long(120000)};
paramtypes = new string[]{"java.lang.long"};
editserviceconnection.invoke(taskon, "waitfortaskcompletion", params, paramtypes);
} catch (throwable t) {
t.printstacktrace();
}
}

}


四.使用j2ee management api

在domain中所有资源可以用j2ee managed object (jmo)来表示。所有这些jmo被数据模型组织成树状结构,其中根jmo称为j2eedomain。每个jmo对象通过一个javax.management.objectname实例来表示它的唯一对象名,形如:
domain:j2eetype=value,name=value,parent-j2eetype[,property=value]*。

java应用可以通过management enterprise java bean (mejb)的远程接口javax.management.j2ee.management来访问administration server上的jmo。事实上jmo只是mbean的另一种包装,因此任何mbean的变化会及时反映到对应的jmo上。这组接口实现了j2ee management specification 1.0(jsr-77)的必选功能,而诸如性能统计,通知服务,用于集成snmp的management information base(mib),向common information model (cim)的映射等可选功能在目前版本中没有实现。通过j2ee management api,开发者可以流览当前domain的所有资源。下面这个例子通过j2ee management api遍历当前domain所有资源,并把他们的objectname打印出来。

import java.io.ioexception;
import java.net.malformedurlexception;
import java.util.iterator;
import java.util.set;
import java.util.properties;
import javax.management.j2ee.management;
import javax.management.j2ee.managementhome;
import javax.management.attributenotfoundexception;
import javax.management.instancenotfoundexception;
import javax.management.objectname;
import javax.management.queryexp;
import javax.naming.context;
import javax.naming.initialcontext;
import javax.naming.namingexception;
import javax.ejb.createexception;

public class getjmonames {
static string url = "t3://localhost:8001";

static string user = "weblogic";

static string password = "weblogic";

public static void main(string[] args) {
try {
getalljmonames();
} catch (exception e) {
system.out.println(e);
}
}

public static context getinitialcontext() throws namingexception {
properties p = new properties();
p.put(context.initial_context_factory,
"weblogic.jndi.wlinitialcontextfactory");
p.put(context.provider_url, url);
if (user != null) {
p.put(context.security_principal, user);
if (password == null)
password = "";
p.put(context.security_credentials, password);
}
return new initialcontext(p);
}

//通过jndi获得javax.management.j2ee.managementhome接口,并构造mejb的远程接口实例。
public static management getmejbremote() throws ioexception,
malformedurlexception, namingexception, createexception {
context context = getinitialcontext();
managementhome home = (managementhome) context.lookup("ejb.mgmt.mejb");
management bean = home.create();
return bean;
}

public static void getalljmonames() {
try {
management rhome = getmejbremote();
string string = "";
objectname name = new objectname(string);
queryexp query = null;
set allnames = rhome.querynames(name, query);
iterator nameiterator = allnames.iterator();
while (nameiterator.hasnext()) {
objectname on = (objectname) nameiterator.next();
system.out.println(on.getcanonicalname() + "\n");
}
} catch (exception ex) {
ex.printstacktrace();
}
}
}



五.常用参数参考

和上述三个mbean server对应的是访问他们分别访问各自mbean的uri路经:
runtime mbean server:
"/jndi/" + "weblogic.management.mbeanservers.runtime"
edit mbean server:
"/jndi/" + "weblogic.management.mbeanservers.edit"
domain runtime mbean server:
"/jndi/" + "weblogic.management.mbeanservers.domainruntime"


以及分别获得三个mbean server上根服务的名称:
weblogic:name=runtimeservice
weblogic:name=editservice
weblogic:name=domainruntimeservice


此外还有一个服务用于获得配置管理器:
weblogic:name=configurationmanager

六.相关文档
jmx: http://java.sun.com/products/javamanagement/.
jmx 1.2 specification: http://jcp.org/aboutjava/communityprocess/final/jsr003/index3.html
jmx remote api 1.0 specification: http://jcp.org/aboutjava/communityprocess/final/jsr160/index.html
javax.management* packages: http://java.sun.com/j2se/1.5.0/docs/api/overview-summary.html
developing applications with jmx:http://e-docs.bea.com/wls/docs90/jmx/index.html
java management api:http://e-docs.bea.com/wls/docs90/j2eemanage/index.html
the weblogic server mbean reference:http://e-docs.bea.com/wls/docs90/wlsmbeanref/core/index.html

关于作者
goblinize, 来自bea, matrix bea产品版版主(http://www.matrix.org.cn/topic.shtml?forumid=28);欢迎访问作者的blog:http://www.matrix.org.cn/blog/goblinize



 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons