`
yangzb
  • 浏览: 3502957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GlassFish移植Tips

    博客分类:
  • Java
阅读更多

       最近,公司的GlassFish移植项目基本告以段落,由于之前的代码严重依赖于Weblogic,给移植工作带来了很大的难度,很多实现方式在 GlassFish中根本就没有对应的替代品。在经历了几个月的移植之后,竟让我对Weblogic开始产生好感了,作为一款商用的 Application Server,Weblogic确实非常成熟,非常强大,提供了很多特性,以帮助提高程序的运行效率,但是太笨重了,访问Admin Console极慢;GlassFish作为一款开源的Application Server,非常适合开发者使用,速度很快,并且严格遵照J2EE的标准,以达到平台独立的特性,但是确实简陋了点,只提供了最标准的实现,并且还存在 一些明显的BUG,社区不够活跃,文档、资源都很少,可能是现在SUN处于动 乱期,连商业Support都很难联系到。下面是我在做移植工作时,随笔记下 来的一些小经验,让其他的同学们少受一些折磨,少踩一些坑。

      1、EJB Client weblogic.jar冲突

若使用 EJB Client访问 GlassFish中的 EJB,需将 appserv-rt.jar appserv-ext.jar appserv-deployment-client.jar javaee.jar加入到 classpath中。若 classpath中存在 weblogic.jar,则可能会遇到错误:
java.lang.NoSuchMethodError: org.omg.CosTransactions.OTSPolicy.value()S
weblogic.jar classpath中移除即可。

      2、Transaction使用

使用 Spring JtaTransactionManager需要配置两个属性: JtaTransactionManager userTransactionName。对于 GlassFish JtaTransactionManager java:appserver/TransactionManager userTransactionName java:comp/UserTransaction。只有 Bean管理的 SessionBean MDB允许使用 UserTransaction Entity Bean只允许使用 Container管理的 transaction。如果 Container管理的 SessionBean MDB使用了 UserTransaction,则会出现错误: Lookup of java:comp/UserTransaction not allowed for Container managed Transaction beans

      3、HTTP Thread count

使用 asadmin修改 HTTP thread count后,从 Admin Console上访问, Admin Server的配置可生效,但 Cluster不生效,检查 domain.xml已改变,通过 asadmin查询也已生效,应该是 GlassFish页面展示的 BUG

      4、EJB Timer的使用

GlassFish中使用 EJB Timer,需要有一个独立的 XADataSource,和数据表 EJB__TIMER__TBL,建表语句可在 <server_path>/lib/install/databases中找到。对于 developer模式, GlassFish默认使用内置的 __TimerPool,不需要你手工创建 datasource和表;对于 cluster模式, Admin Server会默认使用 __TimerPool Cluster则需要单独配置。如果让 Admin Server Cluster同时使用手工创建的 datasource,则可能导致 Cluster配置中的 timer datasource server重启后丢失, Timer Service会出现异常,这应该是 GlassFish BUG,目前的解决方案就是 Admin Server用默认的 Timer配置, Cluster用另外的配置。

      5、ClassLoader优先加载

weblogic中,可以通过配置 prefer-application-packages来优先加载 application中的类,在 GlassFish中则没有对应的方式来控制加载顺序,一个典型的场景就是:项目中采用 CXF作为 webservice的实现,但 GlassFish中默认使用了 Metro的实现,由于 Metro jar包比 application加载的早,就会导致 CXF依赖的类库没有正常加载,而是使用了 Metro JAX-WS的实现。

      6、CMP配置中的数据库表名区分大小写

CMP GlassFish中需要配置 sun-cmp-mappings.xml,该 XML中的 table-name是区分大小写的, Oracle中的表名默认是大写的,如果这里的 table-name写成小写,就会报找不到表的错误,可以通过添加一个 *.dbschema文件,对表名进行适配,以减少切换数据库时的修改操作。

      7、GlassFish的部署结果不可靠

在使用 asadmin部署 EAR时,如果没有遇到极其严重的错误,部署一般都会返回成功,但这个结果并不可靠,你需要关注 server.log,如果这里出现了错误,应用程序则可能没有真正部署成功,在运行时就会出现错误,所以要确保你的程序部署时, server.log中没有错误信息。

       8、TLD路径

 根据 JSP2.1规范, tld文件不能存放在 /WEB-INF/classes或者 /WEB-INF/lib目录中,特别不能放在 /WEB-INF/tags目录或子目录中,否则会出现错误:
 exception: org.apache.jasper.JasperException: PWC6180: Unable to initialize TldLocationsCache
 root cause: org.apache.jasper.JasperException: PWC6336: Illegal TLD path /WEB-INF/tags/fn.tld, must not start with “/WEB-INF/tags”
 在
Tomcat Weblogic中不会出现该问题, GlassFish则严格遵照规范,可将 tld文件放置在 /WEB-INF/tld目录。

     9、注册 servlet listener

web.xml中注册 servlet listener时,在 <listener>中添加多个 <listener-class>不会报错,但是只有最后一个 <listener-class>生效,因此,要注册多个 listener,需要添加多个 <listener>

      10、 Pass-by-reference

Weblogic中的 call-by-reference能够极大的提高本地接口调用的效率,在 GlassFish中也有相应的替代,就是 pass-by-reference,可以在 sun-ejb-jar.xml中对某个 EJB进行配置,也可以在 sun-application.xml中配置,这样就可以对整个 application中的 EJB生效。

      11、 HTTP错误消息体

HTTP ErrorCode大于 400,并且相应的消息体是空时, GlassFish会自动在返回的 Response中添加错误信息,对于使用 HttpClient操作时,就可能和我们期望的 Response不同,该问题的解决办法:在往 Response中写入内容后,调用 response.getOutputStream().flush() response.flushBuffer();或者在 web.xml中设置 ErrorcCde对应的 ErrorPage ErrorPage可以是一个空内容的页面。

      12、 ServletRequest inputStream的使用

InputStream有一个 markSupported属性,如果该属性为 true,则支持 mark reset,可以多次读取该流,反之则只能读取一次该输入流。一种情形就是:如果在 Filter中读取了该 InputStream,则不能在 Servlet中再次读取。 ServletRequest中的 InputStream在不同的 Server中有不同的实现,在 Weblogic markSupported就设为了 true,在 GlassFish中则为 false

分享到:
评论

相关推荐

    glassfish集群搭建手册

    标题《Glassfish集群搭建手册》指的是利用Oracle提供的Glassfish应用服务器软件进行集群配置的详细指南。此手册涵盖了在不同场景下通过图形化界面和命令行方式搭建集群的整个过程,并且描述了如何配置集群环境以支持...

    glassfish安装配置文档

    GlassFish 安装配置文档 GlassFish 是一个基于 Java 的开源应用服务器,提供了一个强大且灵活的平台来部署和管理基于 Java 的应用程序。本文档将指导 readers 通过安装和配置 GlassFish 服务器,并将其与 Eclipse ...

    Glassfish部署web项目

    ### Glassfish部署Web项目知识点详解 #### 一、概述 **Glassfish** 是一款开源的Java EE应用服务器,由Oracle公司维护。它基于Java EE标准,支持多种Java EE技术,如EJB、JPA、JSF等。由于其强大的功能和良好的...

    GlassFish4(GlassFish3)安装

    GlassFish4的下载和安装的详细步骤,下载地址,配置等。附带有GlassFish3的安装简述

    glassfish-3.1.2.2.zip

    《深入解析Glassfish 3.1.2.2与Java EE 6的融合应用》 Glassfish 3.1.2.2是一款由Oracle公司开发的开源应用服务器,它是Java EE 6规范的重要实现者,提供了全面的支持和丰富的功能,为开发者提供了构建企业级Web...

    linux下实现glassfish自动启动

    在Linux环境下,Glassfish服务器的自动化启动是系统管理员和开发者常用的需求,这有助于提升服务器管理效率,确保服务的持续性和稳定性。Glassfish是Oracle公司提供的一个开源Java EE应用服务器,它支持各种Web应用...

    GlassFish5.0安装包

    【GlassFish 5.0 安装与配置详解】 GlassFish,由Oracle公司主导的开源项目,是一款功能强大的Web服务器和应用服务器,以其卓越的性能和丰富的特性在开发者社区中备受推崇。相比于Tomcat,GlassFish提供了更全面的...

    Glassfish安装和启动

    ### Glassfish安装与启动详解 #### 一、简介 GlassFish 是一款开源的应用服务器,它遵循Java EE标准,被广泛应用于开发、测试和生产环境中。本文档将详细介绍如何安装和启动GlassFish应用服务器。 #### 二、安装前...

    glassfish-ose-4.0 白皮书

    《glassfish-ose-4.0 白皮书》是一份详尽的文档,它深入介绍了GlassFish 4.0服务器的各项特性和功能。GlassFish是Oracle公司开发的一款开源的应用服务器,基于Java EE(Java Platform, Enterprise Edition)标准,为...

    glassfish单机集群jk_little

    在IT行业中,Glassfish是一款开源的应用服务器,由Sun Microsystems开发并维护,后来成为Oracle Corporation的一部分。Glassfish支持Java EE(现在称为Jakarta EE)规范,为开发者提供了构建企业级Web应用的平台。当...

    glassfish网络开发服务器

    GlassFish网络开发服务器是一款强大的开放源代码应用服务器,主要用于运行Java EE(Java Platform, Enterprise Edition)应用程序。由Oracle公司维护,它支持各种企业级服务,包括Web服务、EJB(Enterprise ...

    GlassFish2.0的安装

    【GlassFish 2.0 安装详解】 GlassFish 2.0 是 Sun Microsystems 推出的一款免费且开源的 Java EE 服务器,它基于 Java Platform, Enterprise Edition (Java EE) 5规范,提供了包括EJB 3.0、JSF 1.2、Servlet 2.5、...

    Glassfish关于tomcat的文档

    ### Glassfish与Tomcat对比分析 #### 执行摘要 对于Web 2.0初创公司、应用服务提供商以及提供动态Web应用的独立软件供应商(ISVs)而言,应用即业务,而应用服务器中的Web容器技术能够直接影响业务成果。Web容器是...

    glassfish安装手册及源文件

    《Glassfish安装手册及源文件详解》 Glassfish是一款开源的应用服务器,它是Java EE平台的实现,为企业级应用提供了一套完整的开发、部署环境。在本文中,我们将深入探讨如何安装Glassfish,以及如何利用Ant工具...

    GlassFish Eclipse Plugin

    《GlassFish Eclipse Plugin:集成开发环境的强大力量》 GlassFish Eclipse Plugin是专为Eclipse IDE设计的一款插件,旨在提升开发人员在Eclipse环境中对GlassFish应用服务器的管理和开发效率。GlassFish,作为...

    glassfish安装步骤.txt

    ### Glassfish安装步骤详解 #### 一、简介 Glassfish是一款开源的应用服务器,它支持Java EE标准,并且在企业级应用开发中具有广泛的应用。为了能够成功安装并配置Glassfish,确保系统环境中已经安装了合适的JDK...

    glassfish安装

    《Glassfish安装详解》 Glassfish,作为Oracle公司开源的一款Java EE应用服务器,是开发者进行企业级Java应用程序部署的重要平台。本文将详细讲解如何安装和配置Glassfish,以帮助初学者快速入门。 首先,理解...

    glassfish-5.0.1.zip

    GlassFish 是一款强健的商业兼容应用服务器,达到产品级质量,可免费用于开发、部署和重新分发。开发者可以免费获得源代码,还可以对代码进行更改。 GlassFish 是用于构建 Java EE 5应用服务器的开源开发项目的名称...

    glassfish-v2 source code

    《深入解析Glassfish-v2源码》 Glassfish-v2是一款基于Java EE 5标准的开源应用服务器,其源码的公开为开发者提供了深入了解和学习Java企业级开发的宝贵资源。在本文中,我们将深入探讨Glassfish-v2的核心概念、...

Global site tag (gtag.js) - Google Analytics