写点什么

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

评论

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

ai2021安装包 及 Illustrator 2021安装教程

Rose

Visual Studio Code:专业编程工具首选,成就卓越代码!

Rose

Navicat Premium 数据库管理 --Navicat Premium中文汉化包

Rose

高效的剪辑和渲染能力 Final Cut Pro X简体中文安装包

Rose

拼多多详情API接口的获取与应用

科普小能手

拼多多 API 接口 API 测试 pinduoduo API 拼多多数据

如何处理海量数据?基于Milvus向量数据库的高度可扩展性

Zilliz

人工智能 Milvus 大模型 Zilliz 向量数据库

MicrosoftOffice2019密钥 office2019激活教程

Rose

macOS Big Sur(苹果macos11系统)安装包分享及安装教程

Rose

非凸科技银牌赞助GOSIM CHINA 2024,并受邀出席Rust分论坛

非凸科技

开源 rust

商场LED透明屏:选择参考分析

Dylan

品牌 LED display LED显示屏 零售电商市场

1024|京东零售技术人的N种可能

京东零售技术

1024

生成式AI时代的内容安全与系统构建:合合信息文档图像篡改检测创新方案

海拥(haiyong.site)

人工智能

【论文速读】| 攻击图谱:从实践者的角度看生成式人工智能红队测试中的挑战与陷阱

云起无垠

火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款

字节跳动数据平台

多模态大模型活动 | 使用 PAI×LLaMA Factory 搭建文旅问答机器人

阿里云大数据AI技术

人工智能 LLM PAI 问答机器人

鸿蒙网络编程系列34-Wifi热点扫描及连接示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

增长在流量规则巡检的探索实践|得物技术

得物技术

测试 质量保障 流量巡检

Taro 鸿蒙技术内幕系列(一):如何将 React 代码跑在 ArkUI 上

京东零售技术

taro 鸿蒙 前端

浅谈活动中台系统技术债管理实践

vivo互联网技术

技术债 效能提升 项目质量 系统稳定

如CGI一般的分子动力学,让科学家看到了3D渲染后的分子运动「影片」

新消费日报

Stability AI一口气推出3款图像生成模型系列!升级版Claude 3.5 Sonnet能像人类一样操控电脑|AI日报

可信AI进展

京东商品详情API详解:全面掌握返回值字段

代码忍者

API 接口 pinduoduo API

Sketch:专业设计工具首选,成就非凡视觉

Rose

鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

Photoshop 2024对电脑配置有什么要求?ps2024破解安装包分享

Rose

PaddleNLP上新!浪潮信息源2.0全面接入,大模型生态加速进化!

百度Geek说

百度 数据 大模型

Spring高手之路23——AOP触发机制与代理逻辑的执行

砖业洋__

spring aop aop代理

AlDente——Mac 电池管理大师,续航无忧!

Rose

CST如何选择时域求解器的频率范围

思茂信息

cst使用教程 电磁仿真 频率

NocoBase 本周更新汇总:子表格支持分页、工作流优化等

NocoBase

开源 低代码 无代码 产品更新

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