写点什么

解析 GlassFish 3 中的配置组件

  • 2012-03-20
  • 本文字数:3870 字

    阅读完需:约 13 分钟

在 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 )关注我们,并与我们的编辑和其他读者朋友交流。

2012-03-20 00:005381

评论

发布
暂无评论
发现更多内容

为什么-Android-要采用-Binder-作为-IPC-机制?,android输入法开发源码

android 程序员 移动开发

事件分发三连问:事件是如何从屏幕点击最终到达 Activity 的?CANCEL 事件什么时候会触发

android 程序员 移动开发

互联网如今趋势,30岁的程序员如何应对?,PDF超过6000页,

android 程序员 移动开发

五分钟搞定正则表达式,如果没搞定,再加两分钟(1),2021Android面试笔试总结

android 程序员 移动开发

两年 Android 经验面经(有赞等公司),请查收

android 程序员 移动开发

人都傻了!看完这份字节跳动师兄给我的程序员面试笔记,只能说一句牛啊

android 程序员 移动开发

什么?这个天天使用的API竟然被废弃了?,android组件化和模块化区别

android 程序员 移动开发

中年危机并不可怕,可怕的是你没有做好自己的规划,斗鱼Android开发二面被刷

android 程序员 移动开发

纯干货分享 | 研发效能提升——敏捷需求篇

云智慧AIOps社区

开源 开发者 敏捷开发 研发效能 提升效率

天猫Java研发岗面经(技术三面):基础+算法+MySQL+Redis+秒杀架构

Java 编程 程序员 架构

为什么Flutter是跨平台开发的终极之选,安卓framework开发

android 程序员 移动开发

为什么说Android开发一定要有身处安乐之窝,却逢乱世之感的觉悟?

android 程序员 移动开发

事件分发三连问:事件是如何从屏幕点击最终到达-Activity-的?CANCEL-事件什么时候会触发

android 程序员 移动开发

五年Android 开发大厂面经总结,详解系列文章

android 程序员 移动开发

中年程序员崩溃大哭:混不上管理层,加不动班,flutter游戏背包

android 程序员 移动开发

今日头条 Android '秒' 级编译速度优化,我的腾讯安卓面试经历分享

android 程序员 移动开发

人手必备的Jetpack操作手册来了!针对性解决Jetpack组件问题

android 程序员 移动开发

Vue进阶(幺陆贰):vue render函数介绍

No Silver Bullet

Vue 11月日更

京东技术中台的Flutter实践之路,android界面开发经典书籍

android 程序员 移动开发

为了弄懂Flutter的状态管理,-我用10种方法改造了counter-app(1)

android 程序员 移动开发

二本渣渣6年开发面试字节跳动Android研发岗,被怼的有点惨---(1)

android 程序员 移动开发

五年开发经验杭州竟找不到工作:Android开发真等于废人?

android 程序员 移动开发

为什么高级Android程序员永远不必担心自己的技术过时?

android 程序员 移动开发

二本渣渣6年开发面试字节跳动Android研发岗,被怼的有点惨---

android 程序员 移动开发

互联网寒冬下,原生Android开发的路该怎么走?,flutter代码扫描

android 程序员 移动开发

为什么有些大公司的技术,实在是弱爆了?,flutter教程dart

android 程序员 移动开发

为了弄懂Flutter的状态管理,-我用10种方法改造了counter-app

android 程序员 移动开发

互联网BAT大厂(百度、美团等,作为Android开发程序员

android 程序员 移动开发

五分钟搞定正则表达式,如果没搞定,再加两分钟,flutter小程序实现

android 程序员 移动开发

人手必备的Jetpack操作手册来了!针对性解决Jetpack组件问题(1)

android 程序员 移动开发

为了KPI,对APK进行极限优化!,大厂Android研发岗面试复盘

android 程序员 移动开发

解析GlassFish 3中的配置组件_Java_张华_InfoQ精选文章