本文介绍如何基于 JMX 将 Java EE 应用部署到 WebSphere 集群的方法。本文首先将向您阐述 WebSphere 集群架构,然后着重讲解如何基于 JMX 来部署 WebSphere 应用,文中探讨了部署应用到 WebSphere ND 集群和部署应用到单个 WebSphere 服务器之间的异同,并通过程序实例演示如何基于 JMX 将一个 Java EE 应用程序及相关 JMS 应用部署到 WebSphere ND 集群环境中。
WebSphere 集群面向企业应用,旨在提高应用程序的可用性、可扩展性以及性能的方案。一个 WebSphere 集群环境可以由多个工作在不同节点的 WebSphere Application Server 实例组成,对外提供服务时则表现为一个单一的逻辑应用服务器。每个集群由一个部署管理器(DM:Deployment Manager)来统一管理集群中应用程序的部署及其他集群控制功能,部署在集群之上的应用程序运行在集群环境的所有应用服务器中,从而获得集群环境所带 来的高可用性,负载均衡等优势。图 1 演示了一个简单的 Websphere 集群配置拓扑结构。集群中包含三个成员,节点 A 同时包含了集群 1 的部署管理器,所有应用都将通过它自动部署到集群所有节点的应用服务器上。
|
WebSphere Application Server 提供了几种方案来部署安装应用程序,可安装的应用程序文件类型也是多种多样,常见的包括企业归档文件(EAR)、企业 bean(EJB)、Web 归档文件(WAR)、会话启动协议(SIP)模块(SAR)、资源适配器(连接器或 RAR)以及应用程序客户机模块。目前有以下几种常见的 Websphere 应用程序部署方法,包括 :
此种方法通过在 WebSphere 控制台导航树,单击应用程序 > 安装新的应用程序,按照向导的指示信息操作来部署选择待安装的应用程序文件,并按照向导提示一步一步完成安装。
这种方法优点是方便易用,直接通过 WebSphere 控制界面进行部署,但不适用于在产品安装程序中自动部署 Java 应用程序。
wsadmin 脚本可以用于控制和操作 WebSphere Application Server,它是 WebSphere 提供的一种操作界面。利用 wsadmin 脚本部署应用程序要求在对应的部署脚本中或在命令提示符下调用 AdminApp 对象的 install 命令。
该 种部署通过编写脚本实现,优点是简单易操作,不用编写 java 程序,不用编译,缺点是依赖于本地 wsadmin 环境支持,因此只能用于本地部署,无法完成远程安装。此外,脚本部署虽然容易,但是不容易实现一些对交互功能要求较高的操作,从而不适合一些复杂的、需要 和 WebSphere Application Server 进行较多信息交互的安装程序使用。关于使用 wsadmin 部署应用的信息,请参考 WebSphere Application Server 环境配置与应用部署最佳实践。
Java Specification Request 88:Java Application Deployment(JSR 88)定义了一套跨平台的 Java 应用部署标准,这种部署方法支持将应用程序部署到不同类型的应用程序服务器上,使独立软件厂商能够开发可以部署在任何 Java EE 认证应用服务器上的 Java EE 应用程序。很多 Java 应用服务器都支持 JSR 88,例如 WebSphere Application Server。JSR 88 着重于实现部署已打包好的应用程序包,对于其他和被部署的应用程序相关的 WebSphere 资源(例如 JMS 资源、数据库连接资源等),则无法进行管理和配置,还是需要依靠 WebSphere 的 JMX 这类管理接口来实现。
另外,JSR 88 的跨平台优点使得很多跨平台开发、部署工具都采用其来实现应用程序包在各类 Java 应用服务器上无差别的部署。JSR 也支持远程安装和部署。
此 种方法通过调用 WebSphere Application Server 实现的 JMX 管理接口完成部署,WebSphere 的 JMX 管理接口非常强大,可以用它访问和管理 WebSphere 的各种资源。应该说,JMX 接口提供的功能几乎覆盖了 WebSphere 所有的可管理功能项。所以,基于 JMX 接口能够比较容易的访问和配置 WebSphere 的内部资源项。因此,针对一些部署比较复杂、需要频繁获取 WebSphere 的内部资源、对安装过程的自动化和智能化要求较高的安装程序来说,JMX 是较好的选择。当然,WebSphere 实现的 JMX 接口也支持远程的安装,同时还支持对 WebSphere 内部其他资源的配置,例如消息服务的配置、数据库连接资源的配置等。
|
JMX 是用来为应用程序植入管理功能的框架,它是一套标准的代理和服务,提供了将 Java 资源列出到系统管理基础结构的标准方法。使用 JMX 框架,Java 应用程序服务器(例如,WebSphere Application Server)可实现一些特定的管理功能,如列出配置设置,以及编辑设置。此外,此框架还包括可用于监视事务(如应用程序服务器的启动)的通知功能,实现 对服务程序的实时监控等。
JMX 是对应用程序的资源进行管理的 Java 标准,用 Java 程序实现,客户程序可以通过 JMX API 对应用程序的资源进行管理。
JMX 体系结构如图 2 所示,包括三层:
|
WebSphere Application Server 中的 JMX 实现
在 WebSphere Application Server(WAS)中,JMX 作为应用程序服务器的核心管理功能接口被实现。WAS 包含有一个 JMX 代理,所有系统组件都被当作 MBean 接受管理。WAS 的 JMX 代理能够支持两类连接器,分别是 RMI/IIOP 和 SOAP/HTTP(S) ,该代理提供外部程序对应用程序服务器资源的远程访问能力。WAS 所含的所有管理工具都使用这些 JMX 工具来实现其功能。同样 WAS 自身包含的管理工具也是使用 JMX 接口来实现对应用服务器的管理。
WebSphere 集群需要管理和监控分布在不同节点之上的应用程序服务器,因此,WebSphere 集群实现一套特别的分布式 JMX 架构来实现对集群的管理,该分布式管理体系结构具有以下几个特点:
WebSphere 集群中的 JMX 分层消息传递和管理结构如图 3 所示。
|
基于以上 WebSphere 的 JMX 实现架构,本节将首先介绍集群部署和单个服务器部署之间的区别,随后讲解如何基于 JMX 实现应用程序在 WebSphere 集群上的部署。
WebSphere 单机服务部署和 WebSphere 集群部署的区别
WebSphere 单机应用服务器作为一个唯一的应用服务器进行部署时,一个应用服务器上可以同时部署和运行一个或多个 Java EE 应用,图 4 说明了在单机服务器配置中安装应用的过程。单机部署中,安装程序可以通过 JMX 直接调用本地的 MBean 服务器,完成对本地应用服务器的操作和部署应用,本地的部署过程不涉及节点代理和集群的部署管理器。应用配置直接保存在本地,安装文件也直接在本地解压并 存放在本地路径中。
而在 WebSphere 集群环境中部署应用则有些不同,图 5 说明了在 Network Deployment 环境中部署应用的过程。
基于以上不同之处,在采用 JMX 实现单机服务器安装和集群安装时,基于 JMX 的 Java 部署程序将存在以下不同点:
模块安装目标位置选定上存在不同
如果是部署应用程序到单个服务器,则当部署结束,保存系统配置变化时,部署目标服务器被指定为目的地的单个应用服务器名称。目标服务器被指定为 WebSphere:cell=cellName,node=nodeName,server=serveName。按如下代码部署应用程序到单个服务器的安装目的地。
String target = "WebSphere:cell=zxvm2Node01Cell,node=zxvm2Node01,server=server1";
而部署应用程序到集群时,由于需要同步部署服务器与个体节点上的配置,应用文件被拷贝到远程节点,对应的目标服务器也将改变。目标集群被指定为 WebSphere:cell=cellName,cluster=clusterName, 如下代码行所示,IRMCLUSTER 被指定为部署目标。
String target = “WebSphere:cell=zxvm2Cell01,cluster=IRMCLUSTER”;
安装程序连接部署目标服务器时属性设置存在不同。
在 部署到单服务器时 , 部署 Java 程序连接的是应用服务器,如在清单 1 中第 3 行的主机名标明了服务器所在主机的可解析网络名称,在第 4 行中服务器的连接器侦听的端口号 , 在单服务器安装中,应用程序服务器的 SOAP 连接器的缺省端口号是 8880。
而部署应用程序到集群时,清单 1 中第三行主机名将使用集群部署管理器所在主机的可解析网络名称,连接器侦听的端口号是部署管理器的连接器侦听的端口号,SOAP 连接器的缺省端口号是 8879。
1) Properties clientProps = new Properties(); 2) connectProps.setProperty(AdminClient.CONNECTOR_TYPE, 3) AdminClient.CONNECTOR_TYPE_SOAP); 4) connectProps.setProperty(AdminClient.CONNECTOR_HOST, "hostname"); 5) connectProps.setProperty(AdminClient.CONNECTOR_PORT, "8879"); 6) AdminClient adminClient = null; 7) ...... 8) adminClient = AdminClientFactory.createAdminClient(clientProps); |
将 Java EE 应用部署到 WebSphere ND 集群的部署实例
下面,本文将通过示例如何基于 JMX 部署 Java EE 应用到 WebSphere 集群,该演示示例通过以下步骤创建。
第一步,用特定于 WAS 的绑定信息来填充即将被部署的企业归档(EAR)文件。
1) Hashtable prefs = new Hashtable(); 2) prefs.put(AppConstants.APPDEPL_LOCALE, Locale.getDefault()); 3) 4) Properties defaultBnd = new Properties(); 5) prefs.put(AppConstants.APPDEPL_DFLTBNDG, defaultBnd); 6) defaultBnd.put(AppConstants.APPDEPL_DFLTBNDG_VHOST, "default_host"); 7) 8) AppDeploymentController controller = AppDeploymentController .readArchive(earFile, prefs); 9) AppDeploymentTask task = controller.getFirstTask(); 10) while (task != null) { 11) String[][] data = task.getTaskData(); 12) task.setTaskData(data); 13) task = controller.getNextTask(); 14) } 15) controller.saveAndClose(); 16) 17) Hashtable options = controller.getAppDeploymentSavedResults(); |
第 二步,连接到 WAS。要执行安装等管理功能要获得基于 JMX 的 AppManagement MBean,而要获得 AppManagement MBean 首先要创建一个 AdminClient 以建立到 WebSphere 服务器的连接。创建 AdminClient 的过程参见清单 3,第 4 行之后填写目标服务器(集群)的属性,常用属性有主机名,端口号,连接协议类别。接协议主要有两类:SOAP,RMI,本文中的例子为 SOAP。
1) String host = "zxvm2"; 2) String port = "8879"; 3) 4) Properties config = new Properties(); 5) config.put(AdminClient.CONNECTOR_HOST, host); 6) config.put(AdminClient.CONNECTOR_PORT, port); 7) config.put(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP); 8) AdminClient _soapClient = AdminClientFactory .createAdminClient(config); |
第三步,创建应用程序管理代理。应用程序管理代理被用来执行统一管理功能,如安装部署应用程序。创建应用程序管理代理方法如下。
AppManagement proxy = AppManagementProxy.getJMXProxyForClient(_soapClient);
第四步,设置直接由任务收集的部署选项。清单 4 第 1 行把本地信息作为优先选择。第 2 行到第 6 行指定模块的目标集群。
1) options.put(AppConstants.APPDEPL_LOCALE, Locale.getDefault()); 2) 3) String target = "WebSphere:cell=zxvm2Cell01,cluster=IRMCLUSTER"; 4) 5) 6) Hashtable module2server = new Hashtable(); 7) module2server.put("Test4Cluster.jar+META-INF/application.xml", target); 8) module2server.put( "Test4ClusterClient.jar+META-INF/application.xml", target); 9) options.put(AppConstants.APPDEPL_MODULE_TO_SERVER, module2server); |
第五步,创建用于侦听安装事件的通知过滤器并添加侦听器。
JMX
支持对特定的管理事件进行监视,某些事件会生成通知,比如安装应用程序。清单 5 第 1,2 行创建监听安装事件的过滤器。第 3-5 行获取
AppManagement MBean 的 ObjectName。第 6 行添加侦听器,第一个参数是 AppManagement MBean
的 ObjectName。第二个参数标识必须实现 NotificationListener
接口的侦听器对象。本例中,发出调用的对象是侦听器。第三个参数是一个过滤器,您可以用它指出想要接收哪些通知。如果您保留这个值为 null
,您将会接收到来自这个 MBean 的所有通知。最后一个参数是一个 handback 对象,您可以这样设置
JMX,当它发出一个通知时,就把这个对象返回。
1) NotificationFilterSupport myFilter = new NotificationFilterSupport(); 2) myFilter.enableType(AppConstants.NotificationType); 3) Iterator iter = _soapClient.queryNames( 4) new ObjectName( "WebSphere:node=zxvm2CellManager01,type=AppManagement,*"), null).iterator(); 5) ObjectName on = (ObjectName) iter.next(); 6) _soapClient.addNotificationListener(on, this, myFilter, null); |
第六步,安装应用程序。安装应用程序接口是异步执行,会马上退出。如果超时请等待,以使程序不会结束。
proxy.installApplication(earFile, appName, options, null);
Thread.sleep(300000);
第七步,侦听 Java 管理扩展(JMX)通知,以推测操作完成的时间。当安装完成时,除去侦听器,然后退出。
1) public void handleNotification(Notification notf, Object handback) { 2) AppNotification ev = (AppNotification) notf.getUserData(); 3) 4) if (ev.taskName.equals(eventTypeToCheck) && (ev.taskStatus.equals(AppNotification.STATUS_COMPLETED) || ev.taskStatus .equals(AppNotification.STATUS_FAILED))) { 5) try { 6) _soapClient.removeNotificationListener(on, this); 7) } catch (Throwable th) { 8) System.out.println("Error removing listener: " + th); 9) } 10) System.exit(0); 11) }else { 12) System.out.println("install in progress"); 13) } 14) } |
将消息服务应用部署到 WebSphere ND 集群的服务集成总线上
由 于很多 Java EE 应用都使用 JMS(Java Message Service)实现应用之间的消息传递,在 WebSphere 集群部署中,相关的 JMS 应用也需要正确部署到集群环境中。 在 WAS 中,消息传递平台构建在服务集成总线(SIB)之上,它是企业服务总线(ESB) 的一个实现,是将不同应用程序连接在一起实现组件之间无缝集成的一种新方法。本节举例展示如何采用 Java 管理扩展 (JMX) 在集群环境中配置 JMS。
本示例(图 6)将一个集群作为服务集成总线的成员,演示部署一个发布 / 订阅消息模式。集群包括节点 1 中的服务器 1 和节点 2 中的服务器 2。
部署步骤列举如下。
第一步,创建一个 SIB
SIB 是一个逻辑概念。应用服务器(或集群)是总线的成员。作为同一总线的成员的所有应用服务器都共享一个公共基础设施,应用服务器可以在其中交换信息。
清 单 7 是准备工作,其中第 1 行取得 AdminClien 对象(清单 3),第 2 行取得配置服务 (ConfigServic) 对象,配置服务对象用来进行各种配置操作。第 3 行建立会话 , 配置服务支持会话;也就是说,直到保存命令被发出,所有通过配置服务进行的查询和修改才会被存入配置库。第 4-7 行取得集群 ObjectName,第 8-10 行取得单元 ObjectName。
1) AdminClient adminClient = AdminClientFactory.createAdminClient(connectProps); 2) ConfigServiceProxy configService = new ConfigServiceProxy(adminClient); 3) Session session = new Session(); 4) 5) ObjectName cluster1 = ConfigServiceHelper.createObjectName(null," ServerCluster", clusterName); 6) ObjectName[] matches = configService.queryConfigObjects(session,null, cluster1, null); 7) cluster1 = null; 8) cluster1 = matches[0]; 9) 10) ObjectName cell = ConfigServiceHelper.createObjectName(null, "Cell",cellName); 11) matches = configService.queryConfigObjects(session, null,cell, null); 12) cell = matches[0]; |
清单 8 中,创建了一个 SIB,SIB 支持使用基于消息的体系结构和面向服务体系结构的应用程序。总线是一组作为总线成员的一个或多个相互连接的服务器或服务器集群。应用程序在其中一个与其总 线成员相关联的消息传递引擎上连接到总线。清单 8 中第 1 行到第 5 行填写总线属性。总线有哪些属性可以用 wsadmin 命令 $AdminConfig attributes SIBus 获得。
1) AttributeList attrs = new AttributeList(); 2) attrs.add(new Attribute("name", busName)); 3) attrs.add(new Attribute("secure", new Boolean(false))); 4) attrs.add(new Attribute("discardMsgsAfterQueueDeletion",new Boolean(false))); 5) attrs.add(new Attribute("highMessageThreshold", new Long(50000))); 6) ObjectName sib = configService.createConfigData(session, cell, "SIBus", "SIBus", attrs); |
第二步,将集群添加为服务集成总线的一个成员,并指定集群名称。
attrs = new AttributeList();
attrs.add(new Attribute("cluster", clusterName));
ObjectName busMember = configService.createConfigData(session, sib, "busMembers", "SIBusMember", attrs);
第三步,创建主题空间作为目的地,见清单 9。
主 题空间是发布 / 预订主题组成的层次结构,并带有在关联服务集成总线上的每个消息传递引擎中自动定义的发布点。其中第 1-5 行填写主题空间属性,主题空间所拥有的属性可以用 wsadmin 命令 $AdminConfig attributes SIBTopicSpace 获得。
1) attrs = new AttributeList(); 2) attrs.add(new Attribute("identifier", "Test.Topic.Space")); 3) attrs.add(new Attribute("description", "")); 4) attrs.add(new Attribute("sendAllowed", new Boolean(true))); 5) attrs.add(new Attribute("receiveAllowed", new Boolean(true))); 6) ObjectName busDestination = configService.createConfigData(session, sib, "SIBTopicSpace", "SIBTopicSpace", attrs); |
第四步,创建消息引擎,见清单 10。
消 息传递引擎是服务器组件,它提供服务集成总线的核心消息传递功能。消息传递引擎管理总线资源并允许应用程序与总线进行通信。其中第 4-8 行填写消息引擎属性,消息引擎所拥有的属性可以用 wsadmin 命令 $AdminConfig attributes SIBMessagingEngine 获得。
1) String messagingEngineName = nodeName + "." + clusterName + "-TestBus"; 2) String uuid = (String) configService.getAttribute(session, sib, "uuid"); 3) Long highMessageThreshold = (Long) configService.getAttribute(session, sib, "highMessageThreshold"); 4) AttributeList attributelist = new AttributeList(); 5) ConfigServiceHelper.setAttributeValue(attributelist, "name", messagingEngineName); 6) ConfigServiceHelper.setAttributeValue(attributelist, "busName", busName); 7) ConfigServiceHelper.setAttributeValue(attributelist, "busUuid", uuid); 8) ConfigServiceHelper.setAttributeValue(attributelist, "highMessageThreshold", highMessageThreshold); 9) ObjectName messagingEngine = configService.createConfigData(session, cluster1, "SIBMessagingEngine", "SIBMessagingEngine", attributelist); 10) uuid = (String) configService.getAttribute(session, 11) messagingEngine, "uuid"); 12) attributelist = new AttributeList(); 13) ConfigServiceHelper.setAttributeValue(attributelist, "engineUuid",uuid); 14) 15) ObjectName objectname5 = configService.createConfigData(session, busMember, "target", "SIBusMemberTarget", attributelist); |
第五步,创建主题连接工厂,见清单 12。
在 清单 11 获得资源适配器 ObjectName。主题连接工厂用于创建与 JMS 主题目标的相关 JMS 提供程序的连接(用于进行发布和预订消息传递)。其中第 4-8 行填写主题连接工厂属性,主题连接工厂属性可以用 wsadmin 命令 $AdminConfig attributes J2CConnectionFactory 获得。
1) ObjectName ra = ConfigServiceHelper.createObjectName(null, "J2CResourceAdapter", "SIB JMS Resource Adapter"); 2) matches = configService.queryConfigObjects(session, cluster1, ra, null); 3) ra = matches[0]; |
1) ObjectName queueConnectionDefinition = getConnectionDefinition(configService, session, ra, "javax.jms.TopicConnectionFactory"); 2) 3) AttributeList attrs = new AttributeList(); 4) attrs.add(new Attribute("connectionDefinition", queueConnectionDefinition)); 5) 6) attrs.add(new Attribute("name", "TestTopicConnectionFactory")); 7) attrs.add(new Attribute("jndiName", "test/jms/topicfactory")); 8) attrs.add(new Attribute("manageCachedHandles", new Boolean(false))); 9) attrs.add(new Attribute("logMissingTransactionContext", new Boolean(false))); 10) 11) ObjectName topic = configService.createConfigData(session, ra, "J2CConnectionFactory", "J2CConnectionFactory", attrs); |
第六步,创建 JMS 主题。
资 源适配器 ObjectName 对象 ra 在清单 11 中获得。JMS 主题作为发布 / 预订消息传递的目标而使用。其中清单 13 中第 1-4 行填写主题属性 , 主题属性可以用 wsadmin 命令 $AdminConfig attributes J2CAdminObject 获得。
1) AttributeList attrs = new AttributeList(); 2) attrs.add(new Attribute("adminObject", queueAdminObject)); 3) attrs.add(new Attribute("name", "TestTopic")); 4) attrs.add(new Attribute("jndiName", "Test/jms/TestTopic")); 5) ObjectName topic = configService.createConfigData(session, ra, "J2CAdminObject", "J2CAdminObject", attrs); |
第七步,创建激活规范,见清单 14。
资 源适配器 ObjectName 对象 ra 在清单 11 中获得。JMS 激活规范与一个或多个消息驱动的 bean 相关联并为它们提供接收消息所需的配置。其中第2 - 6行填写激活规范属性,激活规范属性可以用 wsadmin 命令 $AdminConfig attributes J2CActivationSpec 获得。
1) ObjectName activationSpec = getActivationSpec(configService, session, ra, "javax.jms.MessageListener", "com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl"); 2) 3) AttributeList attrs = new AttributeList(); 4) attrs.add(new Attribute("activationSpec", activationSpec)); 5) attrs.add(new Attribute("name", "TestActivation")); 6) attrs.add(new Attribute("jndiName", "Test/jms/TestActivation")); 7) attrs.add(new Attribute("destinationJndiName", "Test/jms/TestTopic")); 8) ObjectName j2cActivationSpec = configService.createConfigData(session, ra, "J2CActivationSpec", "J2CActivationSpec", attrs); |
第八步,保存配置。
configService.save(session, false);
保存了会话,在这个会话中进行的所有配置更改才会进入 config 目录,当部署管理器进行同步时,这些改变会保存到各个集群成员。
|
有多种方法可以用来部署应用程序到 WebSphere 应用服务器系列产品中。相比较而言,由于基于 JMX 能够更容易地操作和控制应用服务器,因此更加适合于相对复杂且对安装过程中的自动化和效率要求较高的企业级应用产品的安装。
转至:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0908_sunyan_jmxdeploy/index.html
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论