技术开发 频道

WebSphere应用服务器类加载机制实践

    为了给大家一个直观的感觉,下面给出一个例子说明一个实际项目中classloader的使用情况。

    如下图所示,在WAS上有两个应用程序:Application 1与Applicatoin 2。这个WAS的Application Module Class loader策略被指定成Multiple,这样每个应用程序都会有一个classloader。同时Application 1的Web Module类加载策略被设成“Module”,这样它就会有一个相应的Web Module Class loader来加载相应的web单元。相反,Application 2的Web Module类加载策略被设成“Application”,这样加载Application 2的classloader还会加载它的web单元,见图1。

图1 Application 1与Applicatoin 2的classloader结构

    WAS中classloader的非常好的实践与常见问题分析解决

    下面是一些使用WAS classloader的非常好的实践:

    1) 不要把应用程序依赖的资源放在JVM的系统lib下让JVM的classloader去加载,原因是如果应用程序的委托策略设成PARENT_LAST,可能会造ClassNotFoundException。

    2) 不要修改ws.ext.dirs这个系统属性以此来增加WebSphere Extensions Classloader的加载能力,原因是被扩展的目录可能跟当前已经目录中有冲突,会导致一此不可预期的问题。

    3) 如开启了动态重加载,这种情况下应用如果有对本地类库的依赖关系,最好使用WebSphere "server" Class loader来加载,这样服务器的整个生命周期这些库都能被应用程序可见,即使应用程序被重新加载。

    下面再给出两个实际WAS classloader的相关问题的分析与相应解决方案。

    1) 如果在启动程序时出现如下异常:

    · ClassCastException

    · ClassNotFoundException

    · NoClassDefFoundException

    · UnsatisfiedLinkError

    主要原因是未正确配置负责装入应用程序各单元的类装入器,可以查看一下当前应用程序的类加载结构。一般,我们可以从SystemOut.log这个log文件中找出当前的类加载路径设置,其中包括要加载的库以及还有WAS的扩展目录等。我们还可以利用WAS提供的Class Loader Viewer来更直接的看当前应用程序的类加载情况,方法如下:

    单击Troubleshooting->Class Loader Viewer,进去后可以看到当前服务器上所有的应用程序,然后选取你关注的,然后会列出这个应用的所有组成单元,点击出现异常的那个单元,就会出现这个单元的classloader结构图,依次可以看到从顶到底的classloader结构图,并可以看到所有可以被加载的类或者类库。这样,可以分析当前出现的异常是不是因为不在这个单元的可加载视图里面,或者是不是因为跟别的当前能被加载的类有冲突。图2是一个查看实际应用程序的例子。

图2 查看应用程序的类加载情况

    2) 为何更新了应用的Resource Adapter,但不起作用?

    经常会有这样的情况,假设我们的应用原来用某个版本的Resource Adapter去联连后面的业务系统,因为有了新版本的Resource Adapter,我们更新了应用中的Resource Adapter,然后重新build后发布到服务器上。但是发现这个新版本的某个功能没有起作用。这里可能的原因是当前的服务器上你曾经有过以standalone的方式(让所有应用程序共享)安装了旧版本的Resource Adapter,如图3所示如何查看当前服务器上安装的standalone Resource Adapter。

图3 查看WAS已经安装的standalone Resource Adapter

    如果以Standalone方式安装了旧版本的话,即使你的应用程序中包括了最新的Resource Adapter,但它也不会起作用,原因是应用的类加载默认策略是父亲优先(PARENT_FIRST),它会让WebSphere Extensions Classloader先去试着加载Resource Adapter,而WebSphere Extensions Classloader会把standalone安装的Resource Adapter加载进内存来给应用程序使用。解决方法是更新这个standalone Resource Adapter或者卸载它。

    读者可以学习参考资料部分的资料来进一步提高对WAS classloader的了解。

    参考资料:

    Inside The Java Virtual Machine by  Bill Vennershttp://www.amazon.com/Inside-Java-Virtual-Machine-Venners/dp/0071350934

    IBM RedBook : WebSphere Application Server V6.1 : System Management and Configurationhttp://www.redbooks.ibm.com/abstracts/sg247304.html?Open

    TroubleShooting: Classloader problems for WebSphere Application Server http://www-01.ibm.com/support/docview.wss?rs=180&uid=swg21219358

0
相关文章