BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

解析GlassFish 3中的配置组件

| 作者 张华 关注 0 他的粉丝 发布于 2012年3月21日. 估计阅读时间: 18 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

在GlassFish 3中,存在大量的组件,作者详细分析了其组件配置的架构、工具和应用方法,对于想要深入了解GlassFish的开发人员和系统管理人员有较好的借鉴意义。

1 配置组件研究

在GlasFish中,有大量的配置文件,很大一部分是自动产生的,为助于理解,我们有必要先将它吃透。它也有一个主域配置文件(位于%GlassFishV3%\domains\domain1\config\config.xml),它主要包括以下几个部分:

图1 GlassFish config配置管理组件的组成

  • ConfigBeans: 对于对配置文件的elements、attributes、properties执行get/set/create/delete操作,是一个底层API
  • Admin MBeans: JMX客户端API,包括:GUI/CLI/HTML adapters/remote apps
  • Admin Validator:验证配置,并且防止不合法的配置改变
  • Dynamic-reconfig: 重新配置之后,可以不用重启服务器,实时生效

1.1 配置元数据

在glassfish的config-api模块中包含了大量的配置元数据,有些是自动产生的,有些是手动产生的。

图2 配置元数据

配置文件符合以下三个schema, 这些schema主Relax NG语法来进行属性扩展,所有的属性扩展在其独立的名空间中:

  • sun-domain-1_2.dtd,
  • ConfigBeans
  • Validation Descriptors file

1.2 源代码分析

  • Config Beans: 代码位于HK2核中的config模块,它包含了ConfigContext、ConfigEvent、Listeners的接口和实现。在GlassFish中的config-api模块中的server beans是由sun-domain_1_2.dtd自动产生的,手动产生的是ApplicationsHelper, ClustersHelper, ResourcesHelper等。
  • Admin MBeans: 提供JMX客户端(CLI/GUI/HTML-adapters/remote apis)的访问和管理操作。位于admin-core中的admin子模块中。
  • Config Validator : 验证metadata files,验证基础类,对客户化配置元素的验证等。

2 监控组件研究

我们可以通过以下5种方式访问GlassFish资源:

  • 管理控制台
  • 命令行工具asadmin
  • Jconsole第三方工具
  • 标准的JMX编程接口
  • 面向对象的AMX编程接口

JMX是GlassFish管理架构的基础, GlassFish的设计和实现都遵循了JMX规范,因此也完全支持JMX。这种支持体现在它的命令行管理工具asadmin和管理控制台的功能上,体现在第三方管理工具比如JConsole的对其访问的支持上,也体现在通过标准 的或GlassFish特有的编程接口AMX对其资源的访问方式上。下面通过实例,来看看GlassFish是如何支持这几种方式对其资源进行访问的。

图3 访问GlassFish资源的5种方式

方法1,通过管理控制台

首先,先通过管理控制台来创建一个数据库连接池mypool。在浏览器的输入管理控制台地址:localhost:4848。采用缺省的用户名 “admin”及其密码“adminadmin”登录。成功登录后,在左边的树型菜单中,展开“资源”-“JDBC”-“连接池”。在主面板中,点击“新建”。在面板“新建 JDBC 连接池(步骤 1,共 2 步)”中,输入“名称”为mypool,“资源类型”选为“javax.sql.DataSource”,“数据库供应商”选为“JavaDB”。在接下 来的“新建 JDBC 连接池(步骤 2,共 2 步)”中,可以看到数据库连接池的各项缺省设置。将在“池设置”一栏中的“空闲超时”值由缺省的300改为777。 点击“完成”。至此,我们通过管理控制台完成了对数据库连接池mypook的创建,并修改了其空闲超时的值。

方法2,通过命令行工具asadmin

接下来,我们通过命令行的asadmin来查看这一资源。

asadmin list server.resource* 

运行结果如下:

server.resource-ref.jdbc/__CallFlowPool 
server.resource-ref.jdbc/__TimerPool 
server.resource-ref.jdbc/__default 
server.resources 
server.resources.jdbc-connection-pool.DerbyPool 
server.resources.jdbc-connection-pool.__CallFlowPool 
server.resources.jdbc-connection-pool.__TimerPool 
server.resources.jdbc-connection-pool.mypool 
server.resources.jdbc-resource.jdbc/__CallFlowPool 
server.resources.jdbc-resource.jdbc/__TimerPool 
server.resources.jdbc-resource.jdbc/__default 

这里列出的MBean是用GlassFish自己的DottedName来标识的。接着通过asadmin的子命令get来查看对象mypool的属性:

asadmin get server.resources.jdbc-connection-pool.mypool.* 

或者进一步查看空闲超时(idle-timeout-in-seconds)的属性值。

asadmin get server.resources.jdbc-connection-pool.mypool.idle-timeout-in-seconds 

结果如下:

server.resources.jdbc-connection-pool.mypool.idle-timeout-in-seconds = 777 

至此,我们完成了使用命令行的管理工具asadmin对mypool的访问。这里asadmin通过GlassFish扩展的Dotted Name命名方式来访问MBean的。Dotted Name是GlassFish命令行工具asadmin定义的一套约定。在这套约定的支持下,asadmin的三个子命令(list、set和get )可以通过一个由“.”分隔的字串寻址到GlassFish中的MBean。

方法3,通过第三方工具JConsole

接下来,我们要通过JConsole来访问对象mypool。在JConsole的登录面板中,选择远处进程:localhost:8686(8686是GlassFish缺省的管理端口),用户名同样为 admin,密码adminadmin。登录进来后所看到的是关于GlassFish应用服务器运行时的信息,点击“MBean”。展开树型结构 “com.sun.appserv” - “jdbc-connection-pool” - “my pool” - “config” - “属性”。可以看到我们所关心的连接池mypool的信息。属性idle-timeout-in-seconds的值为777。修改777为888。在回到管理控制台或命令行工具asadmin同样可以看到刚才在JConsole所作的修改已经生效。以上说明三种工具对GlassFish资源的修改是等效的。接下来通过编程的方式来访问数据库连接池mypool。

方法4,通过标准的JMX编程方式

标准的JMX方式的代码如下:

import javax.management. * ;

import javax.management.remote. * ;

public class JMX_demo {

    public JMX_demo() throws Exception {
        //创建JMX 的URL
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi");
        java.util.Map env = new java.util.Hashtable();
        //缺省用户名和其口令
        String[] creds = {
            "admin", "adminadmin"
        };
        env.put(JMXConnector.CREDENTIALS, creds);
        //建立连接
        JMXConnector connector = JMXConnectorFactory.connect(url, env);
        MBeanServerConnection mbsc = connector.getMBeanServerConnection();
        //要访问的MBean的Object Name
        ObjectName mbeanName = new ObjectName("com.sun.appserv:type=jdbc-connection-pool,name=mypool,category=config");
        //所要访问的属性idle-timeout-in-seconds
        System.out.println("Using JMX, jdbc pool idle timeout:" + mbsc.getAttribute(mbeanName, "idle-timeout-in-seconds"));
    }
    public static void main(final String[] args) throws Exception {
        new JMX_demo();
    }
}

运行结果如下:

Using JMX, jdbc pool idle timeout:888 

方法5,通过AMX编程方式

AMX方式的代码如下:

import com.sun.appserv.management.DomainRoot;
import com.sun.appserv.management.client.AppserverConnectionSource;
import com.sun.appserv.management.client.TLSParams;
import com.sun.appserv.management.util.misc.ExceptionUtil;
import com.sun.appserv.management.config. * ;
import java.net.ConnectException;
import java.util.Map; /** * 此类为演示使用AMX方式访问服务器端的MBean的演示代码。 */
public class AMX_demo {
    public AMX_demo() throws Exception { 
	//Domain Admin Server的机器名或IP地址
	final String host = "localhost";
	//JMX管理端口,缺省8686。
	final int port =8686;
	//管理员名
	final String user = "admin";
	// 管理员密码
	final String password = "adminadmin";
	TLSParams tlsParams=null;
	//连接到JMX 
	serverAppserverConnectionSource conn = new AppserverConnectionSource( 
	    AppserverConnectionSource.PROTOCOL_RMI, 
		host, 
		port, 
		user, 
		password, 
		tlsParams,
		null);
	conn.getJMXConnector( true );
	//DomainRoot和JDBCConnectionPoolConfig就是所说的DCP组件 
	DomainRoot mDomainRoot = conn.getDomainRoot();
	//获取JDBCConnectionPool的列表
	Map pools = mDomainRoot.getDomainConfig().getJDBCConnectionPoolConfigMap();
	JDBCConnectionPoolConfig mypool = (JDBCConnectionPoolConfig)pools.get("mypool");
	System.out.println("Using DCP, jdbc pool idle timeout: "+mypool.getIdleTimeoutInSeconds());
}
public static void main( 
    final String[] args ) throws Exception{
        new AMX_demo();
    }
}

运行结果如下:

Using DCP, jdbc pool idle timeout: 888

注意,采用AMX的方式时,在项目的库路径上要加入appserv-ext.jar和javaee.jar。

关于作者

张华,长期从事Java方面的开发工作,有搜索引擎、中间件应用服务器、互联网、云计算等领域的行业经验,目前正在从事基于Power的虚拟化技术研发。博客地址:http://blog.csdn.net/quqi99


感谢崔康对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT