写点什么

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

评论

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

高精度轻量级目标检测产业应用,实现多类通信塔识别

百度大脑

2022年3月中国数据库排行榜:TiDB “三连降”仍霸榜首,“常胜四将军”得分集体下跌

墨天轮

数据库 TiDB 国产数据库 KingBase gbase8a

一周信创舆情观察(2.28~3.6)

统小信uos

在充满挑战的时代天翼云以数字化加速市域社会治理现代化

天翼云开发者社区

通过CRM系统提高生产力的技巧

低代码小观

企业管理 CRM 企业管理系统 CRM系统 客户关系管理系统

HAVE FUN | SOFARegistry 源码解析

SOFAStack

GitHub 开源 程序员 开发者 源码剖析

2022全网最详细的音视频开发学习路线,零基础到项目实战,从小白到音视频专家

Linux服务器开发

音视频 WebRTC ffmpeg 音视频开发 流媒体服务器开发

东方电机打造大国重器 携手天翼云挺起智能制造新脊梁 智能制造的力量 东方电机的数字化前行之路

天翼云开发者社区

以数字化为引领天翼云助力中安公司应急管理云平台上线

天翼云开发者社区

人脸识别闸机惊艳美国运动员背后的黑科技是如何实现的?

天翼云开发者社区

上讯信息正式加入openGauss社区

经验分享 | 如何搭建FAQ/用户培训手册

小炮

运营 客户服务

星际营23期开始招募 门槛高,但是优秀项目可获得全额奖学金,敢来挑战吗?

创业邦

恒源云(GpuShare)_PRGC:基于潜在关系和全局对应的联合关系三元组抽取

恒源云

机器学习 深度学习 算法 知识图谱

上海英方软件正式加入openGauss社区

opengauss

极速体验|使用 Erda 微服务观测接入 Jaeger Trace

尔达Erda

云计算 微服务 云原生 PaaS 分布式架构

在线YAML转TOML工具

入门小站

工具

Flutter ChartSpace:通过跨端 Canvas 实现图表库

字节跳动终端技术

flutter 字节跳动 前端 canvas 图表库

中国协同办公服务软件,你更看好哪一款?

易观分析

协同办公软件

Redis现网那些坑:用个缓存,还要为磁盘故障买单?

华为云数据库小助手

redis GaussDB GaussDB ( for Redis ) 华为云数据库

iOS应用性能数据采集原理和优化实践 | 详细版

云智慧AIOps社区

ios 性能优化 数据采集 Object-c 技术干货

华为云大数据轻模式体验:忘掉底层烦恼,专注数据开发

华为云开发者联盟

大数据 Serverless 数据湖 数据开发 华为云

openGauss助力中国移动获 “ICT优秀案例”

opengauss

Linux之netstat命令

入门小站

Linux

[架构实战营] 模块9设计

Vincent

「架构实战营」

ENS 域名终极指南

devpoint

以太坊 eth 3月月更 ens

Linux curl命令详解

学神来啦

云计算 Linux 运维 curl

详细解读阿里云开源PolarDB总体架构和企业级特性

阿里云数据库开源

数据库 阿里云 polarDB

天翼云发布云原生关系型数据库TeleDB for openGauss

天翼云开发者社区

昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者

华为云开发者联盟

强化学习 mindspore ai框架 图学习 昇思MindSpore

《中国软件根技术发展白皮书(基础软件册)》发布!

opengauss

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