写点什么

解析 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:005499

评论

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

技术管理者如何获得下属的认同?

石云升

极客时间 1月月更 技术领导力实战笔记

【腾讯云AI】用1行Python代码识别增值税发票,YYDS

程序员晚枫

Python 人工智能 发票 OCR

关于环境变量配置的思考总结

timerring

Go 环境变量

【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

码界西柚

redis 性能调优 慢查询

如何用Know Streaming来查询Kafka的消息

石臻臻的杂货铺

Kafk

如何判断候选人与岗位的匹配程度?

石云升

极客时间 1月月更 技术领导力实战笔记

FPGA:硬件描述语言简介

timerring

FPGA

OneFlow v0.9.0正式发布

OneFlow

人工智能 深度学习

复习前端:浏览器渲染机制

devpoint

DOM CSSOM 渲染树 重绘 重排

IntelliJ中高效重构的 10 个快捷方式

JAVA旭阳

Java

Verilog HDL仿真常用命令

timerring

FPGA

复习前端:前端应掌握的网络知识

devpoint

OSI七层协议 http2 HTTPS协议加密

我们需要怎样的低代码平台

agnostic

低代码

影响产品开发决策的认知偏见

俞凡

认知

如何妥善且优雅地做好解聘工作?

石云升

极客时间 1月月更 技术领导力实战笔记

问题代码定位神器: Git Bisect

俞凡

git

FPGA:Verilog HDL程序的基本结构

timerring

FPGA

你知道这个提高 Java 单元测试效率的 IDEA 插件吗

JAVA旭阳

Java

【PHP】英文博客专栏PHP快速入门个人笔记

懒时小窝

php

从任务分配角度来看管理

石云升

极客时间 1月月更 技术领导力实战笔记

我总结了写出高质量代码的12条建议

JAVA旭阳

Java

极客时间运维进阶训练营第12周作业

独钓寒江

设计微博系统中”微博评论“的高性能高可用计算架构

悟空

架构 高可用 高性能 微博评论

企业架构治理指什么,如何做?

涛哥 数字产品和业务架构

架构治理 企业构架

GLM国产大模型训练加速:性能最高提升3倍,显存节省1/3,低成本上手

OneFlow

人工智能 深度学习

精华推荐 | 【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(上篇)

码界西柚

RocketMQ 消息队列 原理分析

模块六作业

Ryan

架构

模块5 微博高性能计算架构设计

KING

FPGA:逻辑功能的仿真与验证

timerring

FPGA

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