IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

WebSphere Application Server V5 系统管理: 第 3 部分:事件通知

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

Shawn Lauzon (lauzon@us.ibm.com), 软件工程师, IBM WebSphere Development

2003 年 7 月 01 日

在第 3 部分,我们将详细描述如何处理通知,重点是描述如何使用通知来确定何时启动和停止服务器。

© Copyright International Business Machines Corporation 2003. All rights reserved.

引言

在本系列的 第 2 部分,我们了解了 WebSphere® Application Server V5的系统管理如何将 Java™Management Extentions(JMX)服务器作为它的核心,而该服务器提供一个标准接口来管理应用程序服务器。在第 3 部分,我们将详细描述如何处理通知,重点是描述如何使用通知来确定何时启动和停止服务器。





回页首


WebSphere Server Manager

为了展示关于如何使用通知的真实示例,我们介绍一个基于 Swing 的管理客户机,它能让您启动和停止服务器并且监视它们的当前状态。它还能够显示系统各个部件正发出的所有通知。我们将首先描述如何该运行系统,然后在接下来的部分解释系统是如何工作的。可以从本文底部的 下载区获取源代码。

为运行程序,请把 servermanager.jar 文件下载到一个位置,比如 c:\temp ,按下面所示设置类路径,然后启动 WebSphereServerManager


set CLASSPATH=%WAS_HOME%\lib\admin.jar;%WAS_HOME%\lib\wasjmx.jar;%WAS_HOME%\lib\namingclient.jar;.

%JAVA_HOME%\bin\java WebSphereServerManager <hostname> <portnumber> <conntype>

程序名( WebSphereServerManager )后面的三个参数包含了连接到独立服务器服务器(适用于 WebSphere Application Server 基本安装)或者连接到部署管理器(在 WebSphere Application Server 网络配置安装中)所需的信息。

  1. 欲连接的主机名(例如, localhost )。
  2. 欲连接的端口(使用 RMI 连接器:对于基本安装来说是 2809 ,对于网络部署来说则是 9809 。使用 SOAP 连接器:对于基本安装来说是 8880 ,对于 Network Deployment 则是 8879 )。
  3. 欲使用的连接器类型, RMISOAP ;根据 下面所阐述的,建议使用 RMI

启动程序后要做的第一件事就是右键单击 WebSphere节点,通过弹出的菜单添加一个服务器。如果正运行独立安装的话,请选择 Add server,然后输入您要连接的服务器的名称(例如, server1 )。添加了服务器之后,您应该能够看到服务器的当前状态是 RUNING(图 1)。在右上方的窗格中,您将看到该服务器接收到的每一个通知的类型。由于没有将通知发送到服务器的进程,所以它只包含了那些从服务器发出的通知。如果您选择了其中一个通知,右下方的窗格就会列出该通知的所有信息。


图 1:基本安装中的 WebSphere Server Manager
基本安装中的 WebSphere Server Manager

在独立安装中不会经常发出通知。要想得到发送的样本通知,请使用 wsadmin 实用程序,并输入下面这些命令:


wsadmin> set notificationService [$AdminControl queryNames type=NotificationService,*]
wsadmin> $AdminControl invoke $notificationService emitNotification
      {test.sample.notification "This is my notification"}

在 Network Deployment 安装中,您将选择 Add cell而不是选择 Add server,然后给出您的单元的名称。之后,您将在该单元上调出弹出菜单,选择 Add node并给出您的节点的名称。最后,从该节点选择 Add server,同时给出您的服务器的名称(图 2)。如果没有修改过缺省的节点同步时间间隔的话,您应该会每分钟接收到三个通知。


图 2. Network Deployment 安装中的 WebSphere Server Manager
NetworkDeployment 安装中的 WebShpere Server Manager

您也可以通过弹出菜单启动和停止服务器。这样可以改变服务器树中所列服务器的状态,同时显示发出的所有通知。请注意,您只能启动一个受管进程,因为不存在启动部署管理器、节点代理或者非受管进程的 MBean 接口。





回页首


启动和停止服务器

有关启动和停止服务器的信息可以在 第 2 部分中找到。在示例代码中, ServerManager 类启动并停止一个特定的服务器。您可以看到,在 第 2 部分中为 getNodeAgentMBean 方法使用了差不多相同的代码。启动进程的代码使用了一个重载的 invokeLaunchProcess 操作,该操作接受一个表示等待服务器启动所花时间的 整型数(Integer) 。我们将零(0)这个值传递给这个整型数,因为我们将一直使用通知来确定服务器开始实际运行的时间;这样可以保证启动服务器的同时客户机一直处于活动状态。


String opName = "launchProcess";
String signature[] = { "java.lang.String", "java.lang.Integer" };
Object params[] = { serverName, new Integer(0) };
Boolean b = (Boolean) adminClient.invoke(getNodeAgentMBean(), opName,
                      params,signature);

InvokeStop 方法通过调用 Server MBean 的 stop 操作来停止服务器。


private void invokeStop() throws Exception {
     // Use the stop operation on the Server MBeanto stop
     // the given server
     String opName = "stop";
     String signature[] = null;
     String params[] = null;
     adminClient.invoke(getServerMBean(), opName,params, signature);
}

为启动服务器,需要调用 NodeAgent MBean 上的 launchProcess 操作,而为了停止服务器,则需要调用您想停止的 Server MBean 上的 stop 操作。 ServerManager 类只能启动 ManagedProcesses(没有使用 JMX 启动其他服务器的方法),但是您可以停止任何类型的服务器。





回页首


使用通知

launchProcess 操作可以同步执行,也可以异步执行,但 stop 操作一直是异步的。这就导致了不知道进程何时彻底停止这种问题。一种了解进程何时彻底停止的方法可以是周期性地搜索 Server MBean,如果找不到,就表示进程停止了。不过,我们还可以通过事件通知来解决这个问题。

当系统中某些事件发生时,通知就会被发给所有的侦听器。侦听器可以与服务器注册在相同的进程中,或者注册在相同或不同机器上的一个远程进程中。在远程进程中注册侦听器只需获取一个 AdminClient 并调用 addNotificationListener 方法即可。下面是侦听来自 server1 的所有错误和警告消息的示例:


 1 ObjectName queryMBean = new ObjectName("WebSphere:type=RasLoggingService,process=server1,*");
 2 // ... initialize adminClient ...
 3 ObjectName rasMBean = (ObjectName) adminClient.queryNames(queryMBean,null).iterator().next();
 4
 5 NotificationListener listener = new NotificationListener() {
 6   public void handleNotification(Notification n, Object handback) {
 7     System.out.println("Got notification: " + n);
 8   }
 9 };
10
11 NotificationFilterSupport filter = new NotificationFilterSupport();
12 filter.enableType(NotificationConstants.TYPE_RAS_FATAL);
13 filter.enableType(NotificationConstants.TYPE_RAS_ERROR);
14
15 Object myHandback = null;
16
17 adminClient.addNotificationListener(rasMBean, listener, filter, myHandback);

在上面的代码中:

为了在服务器进程中注册一个通知侦听器,您可以使用 servlet,然后执行与上面一样的通用步骤。但是要使用 AdminService 类而不是 AdminClient。

除去一个有相似调用的侦听器:


adminClient.removeNotificationListener(rasMBean, listener);

我们在这里传递了注册侦听器时所用的 ObjectName 和侦听器。





回页首


通知的属性

我们提到过通知所具有的两个属性:source 和 type。虽然到目前为止这是两条最有用的信息,但还是有其他信息的。下面列出了通知所具有的属性;尽管您不能将它们当作属性直接访问,但它们都具有 Get 方法:


source: 发出通知的 MBean;当使用 AdminClient 或 AdminService 类时,它总是 ObjectName ,但在向内部 MBeanServer(此处未讨论)注册时,它也可以是对实际 MBean 的引用。
type: 通知的类型是由点分开的有序字符串集合,本质上一般是分等级的。由 WebSphere Application Server 定义的通知都以“ websphere. ”或“ ws. ”开头,而由 JMX 基础结构定义的则以“ jmx. ”开头。当使用 NotificationFilterSupport 时,您可以启用类型的前缀来接收那种类型的所有通知。例如,如果我们想侦听所有以 websphere.ras 开头的通知,只要传递 NotificationConstants.TYPE_RAS (它会解析为“ websphere.ras ”)即可。
sequenceNumber: 所有通知都有一个 long 型的序列号。由于通知模型不保证通知是有序的(尽管通常是有序的),所以可以用这个序列号按适当的顺序为通知排序。
timeStamp: 以毫秒为单位记录发出通知时刻的时间,用从 1970 年 1 月 1 日 00:00:00 为起始换算成的毫秒数表示(同 System.currentTimeMillis() 一样)。
message: 可详细描述通知的可选消息。大多数的 WebSphere Application Server 通知不包含 message。
userData: 在通知中包含附加数据的可选对象。许多 WebSphere Application Server 通知都有 userData 对象;它经常是一个 Properties 对象,但也没规定必须是 Properties 对象。(例如, websphere.ras 通知包含一个 com.ibm.ejs.ras.MessageEvent 对象)。





回页首


WebSphere Application Server 通知的增强功能

扩展的侦听器注册

添加侦听器的标准 JMX 方法有一定的局限性。其一是 MBean 必须在系统上,这样才能将侦听器添加到 MBean。另外就是,如果想将一个侦听器添加到多个 MBean,就必须多次注册。WebSphere Application Server 提供了其他的一些注册方法使您可以同时解决这两个局限性:


void addNotificationListenerExtended(ObjectName name,
    NotificationListener listener, NotificationFilter filter,
    Object handback);
void removeNotificationListenerExtended(NotificationListener listener);

正如您所看到的,在注册时传递的参数是相同的。然而,您可作为 name 参数传递的值是不同的;您可以不用传递完整的 ObjectName,而是以与 queryNames 中相同的语法来传递部分 ObjectName。因此对于上面那个例子,您本来应该直接将部分 queryMBean ObjectName 传递给 addNotificationListenerExtended 以节省 queryNames 调用,而不是将 rasMBean 传递给 addNotificationListener

扩展的注册方法的另一个优点就是:它可将侦听器添加到还未存在的 MBean。因此,如果一个侦听器被注册到了一个 MBean 集合,那么添加到该集合的其他 MBean 就会自动将该侦听器添加给自己。那样,您就可以将还未解析为任何内容的部分 ObjectName 传递给 addNotificationListenerExtended ,当 MBean 被激活时,您就会立刻接收到通知;如果它被传递到 addNotificationListener 的话,就会有一个 InstanceNotFoundException 被抛出。

侦听器除去方法与标准的除去方法稍有差别,因为它不使用 ObjectName 。而是除去所有添加后带有那个侦听器 MBean。不同的 API 是为了表明您不能在将一个侦听器添加到一个 MBean 集合后再从那些 MBean 的子集中除去该侦听器。

知道将来的版本将会反对使用 removeNotificationListenerExtended(NotificationListener) 方法是相当重要的。代替它的是一个与标准除去方法完全匹配的除去方法(它接受一个 ObjectName 和一个 NotificationListener)。这样就允许您将一个侦听器同时添加到两个 MBean 集合(用两次 addNotificationListenerExtended 调用),并且只从其中的一个集合中除去该侦听器。但"不"允许您从添加了侦听器的 MBean 的子集中除去该侦听器;要除去的 ObjectName 必须与要添加的完全一样。这样,它就与标准的添加/除去侦听器操作更一致了。

Network Deployment 安装中的通知

综上所述,应用程序服务器只是自动把通知分别发给在本地注册的侦听器(例如,另一个 MBean)和在远程注册的客户机。而在 Network Deployment 安装中,还将来自应用程序服务器的所有通知发送到同一台机器上的节点代理。同样,也将节点代理中的所有通知发送到部署管理器。我们说,通知被“传播到上行服务器”,如图 3 所示;箭头表示流向上行服务器的通知。这种功能上的增加用处之大简直令人难以置信,因为它允许您用部署管理器注册一个通知侦听器以获得来自远程服务器上的 MBean 的通知。


图 3. Network Deployment 安装的通知流程
 Network Deployment 安装的通知流程

WebSphere Application Server V5.0.1 中,除非添加了侦听器,否则通知不会被真正传播到上行服务器。因此,如果没有用于特定通知的侦听器,通知就不会被真正地传播。尽管在 V5.0.1 中网络流量有所下降,但是 V5.0 发出的通知与 V5.0.1 发出的通知从外表上来看并没有什么区别。





回页首


处理通知

本文中给出的 WebSphere Server Monitor 应用程序会预定某个特定服务器、单元或节点中的所有通知。这样做的目的就是让您能够看到所有正发出的通知。但不应该预订生产单元中的通知,因为这会导致来自“所有”服务器的“所有”通知都被发送到部署管理器。随着节点的增加,所有通知的流动会让您的网络吃不消。然而,考虑到本示例的目的,说明一下所有发出的通知是非常有用的。

当单元、节点或服务器对象添加到服务器树上时,就会创建 ServerMonitor 对象。其目的之一就是为该单元、节点或服务器上发生的所有通知进行注册。这个目的将在 addListener 方法中实现。


private void addListener() throws ConnectorException {
    ac.addNotificationListenerExtended(getMBeansListenedTo(),
                                       this,null, null);
}

private ObjectName getMBeansListenedTo() {
    if (mbeansListenedTo == null) {
        StringBuffer buf = new StringBuffer();
        buf.append("WebSphere:*");
        if (cellName != null) {
            buf.append(",cell=");
            buf.append(cellName);
        }
        if (nodeName != null) {
            buf.append(",node=");
            buf.append(nodeName);
        }
        if (serverName != null) {
            buf.append(",process=");
            buf.append(serverName);
        }

        try {
            mbeansListenedTo = new ObjectName(buf.toString());
        } catch (MalformedObjectNameException exc) {
            // ignore
        }
    }
    return mbeansListenedTo;
}

这段代码的主要部分只是用来创建部分 MBean ObjectName 。如果要侦听单元,只需设置 cellName 属性即可,这样我们就可以侦听 WebSphere:*,cell=mycell ;由于一直只有一个单元,因此这就与系统发出的所有通知相匹配。如果侦听服务器的话,就要设置所有属性,这样才可以侦听 WebSphere:*,cell=mycell,node=mynode,process=server1 ;这将与 mynode 节点中运行着的 server1 发出的所有通知相匹配。侦听器注册本身很简单,只是将 this 当作 NotificationListener 传递。这意味着 this 对象实现了 handleNotification 方法:


public void handleNotification(Notification n, Object handback) {
    listModel.addElement(n);
}

上面的代码仅仅是把所有的通知添加到 listModel ,一个 NotificationListModel 实例。这个类有三个目的:

  1. 将我们所保存的通知数限制到 100。
  2. 继承 javax.swing.DefaultListModel 类使通知的显示更加容易。
  3. 将每个通知都包装到 NotificationWrapper 中。此举的理由是 Notification 类中的 toString 实现并不显示通知的类型,但它却被认为是最重要的部分。因此我们用一个返回通知类型和接收到通知的时间的实现来覆盖那个方法。

这个类还提供了一个方法 toDetailedString ,该方法返回一个包含通知中所有数据的字符串(String)。


public String toDetailedString() {
    StringBuffer buf = new StringBuffer();
    buf.append("type = " + n.getType() +"\n");
    buf.append("message = " + n.getMessage()+ "\n");
    buf.append("source = " + n.getSource()+ "\n");
    buf.append("seqNum = " + Long.toString(n.getSequenceNumber())+ "\n");
    buf.append("timeStamp = " + new Date(n.getTimeStamp())+ "\n");
    buf.append("userData = " + n.getUserData()+ "\n");

    if (n.getUserData() instanceof MessageEvent) {
        buf.append(" (MessageEvent= " +
                ((MessageEvent)n.getUserData()).
                getLocalizedMessage(Locale.getDefault())+ ")\n");
    }
    return buf.toString();
}

请注意,对于包含 MessageEvent 作为 userData 的 websphere.ras 通知,要显示实际通知数据的可读版本,只需调用 getLocalizedMessage 即可。





回页首


使用通知来监视服务器

现在我们具备了足够的知识来监视服务器。首先,我们描述一下启动和停止服务器时实际发出哪些通知。

  • 当服务器启动时,Server MBean 会发出一个 j2ee.state.starting 通知。
  • 当它完全启动后,它发出一个 j2ee.state.running 通知。
  • 当发出 stop 操作时,它发出一个 j2ee.state.stopping 通知。
  • 当它完全停止后,它发出一个 j2ee.state.stopped 通知。

在 Network Deployment 环境下,“父”服务器会代表“子”服务器发出某些通知。当应用程序服务器(子服务器)启动时,NoteAgent MBean(运行在节点代理进程中的父服务器)通常会发出一个 websphere.process.starting 通知。应用程序服务器在发出 j2ee.state 通知后不久,这个 NodeAgent MBean 就会接着发出 websphere.process.runningwebsphere.process.stopping 以及 websphere.process.stopped 通知。同样,当节点代理启动或停止时,DeploymentManager MBean(正运行在部署管理器进程中)会发出 websphere.process 通知。 userData 属性包含一个 Properties 对象,该对象包含已启动进程的名称(键 NotificationConstants.KEY_PROCESS_NAME ),而对于节点代理来说,则包含节点名(键 NotificationConstants.KEY_NODE_NAME )。表 1 列出了 WebSphere Application Server 发出的通知(通知可能会有所增加,因此这并不是完整的清单)。


MBean 类型发出的通知发出时间
ApplicationManager websphere.admin.appmgmt 应用程序安装或卸载时
Cluster websphere.cluster 群集启动、运行、停止时或停止后
Cluster websphere.cluster.partial 一些群集成员在运行中,而另一些不在运行中时
ConfigRepository websphere.repository 修改配置库时
DeploymentManager websphere.process 节点代理启动、运行、停止时或停止后
Discovery websphere.discovery.agent * 添加或除去上行进程时
Discovery websphere.discovery.process * 添加或除去下行进程时
NodeAgent websphere.process 受管进程启动、运行、停止时或停止后
NodeSync websphere.nodesync 节点同步开始后或完成后
NotificationService websphere.addnode.removenode 在 addNode 或 removeNode 期间发出消息时
RasLoggingService websphere.ras 向活动日志添加全部消息时

* 这些通知只能被 WebSpehere Application Server 内部使用;不应该被其他外部软件产品使用

先前声明过, 通常会发出 websphere.process.starting 通知。是否发出该通知取决于服务器是怎样启动的。如果使用了 launchProcess 操作来启动进程的话,就会一直发出 websphere.process.starting 通知。如果使用 startServer命令来启动进程的话,就不会发出 websphere.process.starting 通知。由于启动节点代理的唯一办法是通过 startNode命令,所以就永远不会从 DeploymentManager MBean 发出 websphere.process.starting 通知。

您考虑定时启动或停止时,发送这些通知的理由就显而易见了。在服务器完全启动之前,您是无法添加侦听器的。只有它运行起来后您才可以将侦听器添加到该服务器,那时早已发出了 j2ee.state.startingrunning 通知。同样,如果您已经注册了侦听器,您可能会接收到一个 stoppingstopped 通知,具体接到哪一个通知要取决于服务器的实际停止速度(记住,通知是异步的)。通过将侦听器注册到上行服务器可以保证启动或停止下行服务器时您会收到通知。

在样本代码中, StateMonitor 类会监视何时启动和停止了服务器。为了监视一个受管应用程序服务器(Network Deployment 中)或节点代理,该类会使用 websphere.process 通知,因为它们比 j2ee.state 通知更可靠。为了监视一个非受管应用程序服务器(在基本安装中)或部署管理器,它则会使用 j2ee.state 通知,因为 websphere.process 通知不可用。下面是几点有趣的地方:

  • determineCurrentState 方法根据 Server MBean 的存在与否确定服务器目前是在运行中还是已停止:如果该方法找到 MBean,则服务器是在运行中;否则,就表示服务器已停止。注意,如果未定义服务器,则它会被视为已停止。
  • monitor Process_TypeProcess 会将侦听器添加到适当的 MBean(如果是侦听 j2ee.state 通知的话,则会添加到服务器,如果是侦听 websphere.process 通知的话,则添加到上行进程 MBean )。我们使用扩展的添加方法,这样就能侦听服务器,即使它当前已停止(在此种情况下,MBean 还未被激活)。
  • 有两种方法可以用来创建过滤器: createJ2EEStateFiltercreateWebSphereProcessFilter 。通常,最好是在注册过程中来传递过滤器,即使当前实现只发出某种特定类型的通知。这就避免了将来遇到可能可以实现,但是程序却无法处理的的未知的通知。注意,此处我们使用 NotificationConstants 中定义的常量。
  • handleNotification 方法根据我们正监视的进程的类型把自己的工作委托给其他两个方法。 handleWebSphereProcessNotification 方法很值得一提,因为既然某个特殊的 ServerMonitor 可以为它不监视的服务器接收通知,那么我们就需要根据 userData 属性来决定该通知是否重要。只有它的名字(服务器名或节点名)与我们监视的服务器形式相匹配时,才可以继续接收并真正地改变状态。




回页首


SOAP 与 RMI 连接器

本文一开始,我们就建议使用 RMI 连接器来运行 WebSphere Server Manager,而不要使用 SOAP 连接器。对此需要做一些解释。SOAP 连接器的优势在于具有比 RMI/IIOP 更多的穿过防火墙的机会(因为它是使用 HTTP 进行通信)。如果在您的安装中有防火墙的话,您就需要使用 SOAP 而不是 RMI。而一般情况下使用 RMI 接收通知比使用 SOAP 更快。这是因为 RMI 使用“推(push)”模型而 SOAP 使用“拉(pull)”模型。

当使用 RMI 连接器时,会在客户机端和被传递到服务器端的存根上创建远程对象。无论何时在服务器上接收到通知,它几乎是立刻被发送(或者说“推”)到客户机并被传递给已注册的侦听器。遗憾的是,SOAP 不允许这样做,因为 HTTP 是请求/响应协议。使用 SOAP 时,每隔一段固定的时间,客户机就会为该侦听器请求任何来自服务器的通知。如果有的话,就从服务器将它们返回(或者说“拉”回)并传递给侦听器。这大约会每 20 秒发生一次,但如果接收的通知量很大的话,也可以发生得更频繁一点。

由于使用 SOAP 连接器时,接收通知的时间可以长达 20 秒,因此建议尽可能使用 RMI 连接器接收通知。要想看时间上的实际差别,您可以分别使用 SOAP 和 RMI 连接器来运行样本代码,然后比较结果。如图 1 和 2 所示,在客户机上接收通知的时间显示在右上方的窗格上,实际发送通知的时间显示在右下方的窗格上。通过比较这两个值,您就可以知道接收通知要花费多少时间。





回页首


发出您自己的通知

通知一直是从 MBean 发出的。这通常表示要想发送一个通知,您就需要创建您自己的 MBean,同时向 MBeanServer 注册它。(本系列的 第 4 部分将描述如何注册您自己的 MBean。)然而,也存在一种不必实际编写 MBean 就能发送通知的方法。这种方法就是使用每个服务器上都有的 NotificationService MBean。

NotificationService MBean 包含一个允许客户机进程发出通知的操作。通过调用 emitNotification 方法,客户机可以指定 NotificationServer MBean 将发送的通知的类型以及可选的 message 和 userData。MBean 的源是无法指定的;它始终是 NotificationService MBean 本身。下面的代码使用了 emitNotification(String notificationType, String message) 操作来发出通知:


ObjectName queryMBean = new ObjectName("WebSphere:type=NotificationService,process=server1,*");
// ... initialize adminClient ...
ObjectName notifMBean = (ObjectName) adminClient.queryNames(queryMBean, null).iterator().next();

String notificationType = "mycompany.myresource.myevent";
String message = "An event from myresource has occurred";

Object[] params = new Object[] { notificationType, message };
String[] paramTypes = new String[] { "java.lang.String", "java.lang.String" };

adminClient.invoke(notifMBean, "emitNotification", params, paramTypes);

WebSphere Application Server 内部使用这个方法来让管理控制台显示 addNoderemoveNode 命令的状态。控制台上显示的每一条消息实际上都是从命令发出的通知。

NotificationService MBean 上的另外一个操作就是 propagateNotifications 。下行服务器内部使用它将通知传播给上行服务器。其他应用程序不准使用它。





回页首


结束语

通过本文我们了解了 WebSphere Application Server 通知系统,以及如何注册以接收系统上发生的事件的通知。我们还研究了一段程序,通过它可以启动和停止服务器,还可以监视这些服务器的进程,同时我们还查看了通过系统发送的所有通知。具备了这些知识,您就可以顺利地开发几乎所有存在于服务器之外的管理应用程序了。在第 4 部分,Leigh Williamson 将描述如何编写自己的 MBean 来扩展 WebSphere Application Server 自身。





回页首


相关信息






回页首


下载

名字大小下载方法
servermanager.jar0.1 MBHTTP
servermanager-src.jar0.1 MBHTTP
关于下载方法的信息


关于作者

Shawn Lauzon是 IBM 的一名软件工程师,在位于德克萨斯州奥斯汀市的 WebSphere Systems Management 部门工作。他写过适用于 WebSphere Application Server V5.0 的 Notification Service 的实现。他曾从事过 WebSphere Connection Pooling 和业务规则 Bean(Business Rule Bean)。您可以通过 lauzon@us.ibm.com与 Shawn 联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款