级别: 初级 Jason McGee (jrmcgee@us.ibm.com), WebSphere Application Server, IBM Software Group
2003 年 5 月 01 日 本文的问答有关 WebSphere Application Server Base 的首席设计师 Jason McGee 答复关于来自于 WebSphere Application Server、J2EE 和 Java 等方面的 WSDD 用户的最重要的问题。
© Copyright International Business Machines Corporation 2003. All rights reserved.
这个月我们邀请了
Jason McGee来回答关于 WebSphere Application Server、J2EE 和 Java 等方面的问题。WebSphere Application Server 是基于 Java 的 Web 应用程序服务器,它建立在开放标准的基础之上,帮助您部署和管理从简单的 Web 站点到功能强大的电子商务解决方案这样的应用程序。Jason 是 WebSphere Application Server Base/Network Deployment 的首席设计师。关于更多信息,请参阅
WebSphere Application Server 专区。
我们衷心感谢所有提出问题的 WebSphere 开发者。
问:在 WebSphere Studio Application Developer 5.0 中,我不断接收到如下所示的控制台输出:
Servlet Request Processor Exception: Virtual Host/WebGroup Not Found:
The web group /theme/Master.css has not been defined
|
这一消息在应用程序中的每一个 CSS 文件中重复出现。
(由 Jay Burrill 提出)
答:您所提问题的确切原因要取决于您的配置,如果没有更多信息,将很难诊断。然而,也许知道一点背景信息会有所帮助。WebSphere 支持 Web 应用程序的虚拟托管。这意味着:当向应用程序服务器发出请求时,将用整个 URL(主机、端口和 URI)定位适当的 Web 应用程序来为这一请求提供服务。之所以会产生您收到的消息是因为应用程序服务器无法定位匹配的虚拟主机或与 URI 相匹配的 Web 应用程序。
为查找虚拟主机,应用程序服务器将会查看传入的请求的主机和端口。也就是您的浏览器地址栏中的主机和端口,或者更为精确地说,是 HTTP 请求的主机头中发送的主机和端口。因为收到了这条消息,您将会转到 AppServer,所以这个问题可能与您的 WebSphere 配置中的虚拟主机别名列表有关。虚拟主机的信息被存储在
<install root>/config/cells/<cell name>/virtualhosts.xml 文件中。请确认您将使用的端口被列于这一文件中。
假设虚拟主机设置正确,同时主机名和端口也没问题,那么产生这条消息的另一个可能的原因是应用程序服务器在已被定位用来为请求提供服务的虚拟主机上找不到合适的 Web 应用程序。换句话说就是,在上下文根与 URL 相匹配的正确虚拟主机上找不到 Web 应用程序。在您提供的以上示例中,上下文根必须是 be/ 或
/theme 。如果没有带这两个上下文根其中之一的 Web 应用程序,那么您就会收到这条消息。
问:当使用 LDAP 用户注册表时,有没有办法用程序来获取应用程序服务器的
security.xml 文件中所配置的主机名、端口和基本 DN?我想通过 JNDI 从目录中获取某些特殊用户的属性,但我不喜欢必须两次指定我的 LDAP 服务器信息这个主意。
(由 SS 提出)
答:这是有可能的,但比较复杂。并没有直接的 API 可让您访问您想访问的信息。但 WebSphere 的所有配置信息都可以通过 JMX API 获得,包括所有包含在 XML 配置文件中的配置信息。有一些公共 API 被提供用来访问 JMX 和 WebSphere 提供的 MBean。刚开始时,请参阅 WebSphere 5 InfoCenter 的文章
Creating a custom Java administrative client program using WebSphere Application Server administrative Java。它将会提供一些关于通过程序访问 WebSphere 管理系统基础方面的很不错的背景知识。对于您的情况,您是想访问 ConfigService Mbean。ConfigService 将允许您访问服务器的配置信息。您希望通过 ConfigService 访问 LDAPUserRegistry 类型。它将提供以下属性,这些属性将提供您需要的信息:
"baseDN String"
"bindDN String"
"bindPassword String"
"hosts EndPoint*"
"ignoreCase Boolean"
"limit Integer"
"monitorInterval Long"
"properties Property(TypedProperty)*"
"realm String"
"reuseConnection Boolean"
"searchFilter LDAPSearchFilter"
"searchTimeout Long"
"serverId String""serverPassword String"
"sslConfig String"
"sslEnabled Boolean"
"type ENUM(NETSCAPE, DOMINO502, CUSTOM, ACTIVE_DIRECTORY, NDS, IBM_DIRECTORY_SERVER, IPLANET, SECUREWAY)"
|
下面是 InfoCenter 中的一些文章,它们提供了通过程序使用 ConfigService 的示例:
关于参考信息,请参阅产品安装目录下的
MBean API Reference和产品 Javadoc:
<install root>/web/mbeanDocs/index.html and <install root>/web/apiDocs/index.html 。
问:我希望知道 WAS 4.0 中的缺省目录。我试图从 WebSphere Studio Application Developer 运行我的 Web 应用程序。我的 Web 项目包含一个 servlet 和一个 JSP。我的 servlet 和 JSP 使用属性文件来读取某些参数。我应该把 JSP 和 servlet 的属性文件放置在何处?一般情况下,用来读取这些属性文件或任意其他资源的缺省目录可以是哪些目录?
(由 Sreenivasa Rao P 提出)
答:服务器的缺省目录实际取决于服务器的启动方式,因此是一种不可靠的为 Web 应用程序加载属性文件及其他资源文件的方法。最好用的办法是 servlet 规范指出的办法。把属性文件(我们把它命名为
foo.properties )放置在您的 Web 应用程序中的某处(我们假设是放在 WAR 的下属子文件夹中)。使用下面的语句获取属性文件上的 InputStream:
InputStream in = getServletContext().getResourceAsStream("/props/foo.properties");
|
不管服务器的缺省目录是什么,也不管 Web 应用程序在磁盘的什么位置上,这种方法都可行。它允许属性文件保存在应用程序自身内。
问:我们如何在运行时通过 Java 程序来检索 WebSphere 5.0的环境变量,如
WAS_HOME ?我猜想我们应该使用某种 WAS API 来完成。您可以告诉我们一些关于如何使用 WAS API 的参考资料吗?
(由 John Wen 提出)
答:WebSphere 的许多具体变量都在应用程序服务器中作为系统属性来提供,您只需使用
System.getProperty() 就可以读取它们。例如,
WAS_HOME 变量被作为系统属性
was.install.root 提供。我已经在下面列出了 WebSphere 系统属性的部分列表:
was.repository,temp
was.install.root
user.install.root
ws.ext.dirs
|
问:关于 WebSphere Application Server 5.0 的安装问题:我的一些客户仍在使用 WebSphere Application Server 高级版 4.0,因此我更希望在同一台机器上同时安装 Application Server 4.0 和 Application Server 5.0 来支持他们。Application Server 5.0 可以与 Application Server 4.0 共存吗?我还听说 Application Server 5.0 的嵌入式消息传递组件会干扰现有的 WebSphere MQ 并且会妨碍 WebSphere Studio Application Developer 5.0 的安装。请您告诉我如何避免这种冲突。
(由 EC 提出)
答:WebSphere 4.0 可以与 5.0 版本同时在同一台机器上共存。同时支持把这种配置直接内建到 WebSphere 5 的安装程序中,另外 InfoCenter 还提供了关于如何设置这种共存的信息。
Setting up Version 4.0.x and Version 5 coexistence详细描述了应该如何设置。至于 MQ问题,WebSphere 的嵌入式消息传递并不干扰 WebSphere MQ,但您不可以同时分别安装这两者。如果您已经在系统上安装了 WebSphere MQ,可以配置WebSphere 使用它,而不要使用嵌入的提供程序。关于更多信息,请参阅
Installing WebSphere MQ as the JMS provider。
问:我把一个基于 Struts 的 web 应用程序部署到了 WebSphere Application Server 5.0,并且一切运行正常。然而,一旦我在服务器上启用了 Java2 Security,该应用程序就不再运行,即便
WAS.policy 文件中设置了正确的许可权也是如此。您是否可以在启用 Java2 Security 的同时让基于 Struts 的应用程序在 Application Server 5.0 上运行?
(由 MervinW 提出)
答:当然了。WebSphere 5.0 管理控制台(WebSphere 5.0 Administration Console)是一个基于 Struts 的应用程序,它可以和启用的 Java2 Security 一起工作。遗憾的是,如果没有更多的信息,我无法真正详细回答如何解决您的问题。请确认您已修改了您的应用程序中的 EAR 文件的 META-INF 目录中的
was.policy 文件。如果您已安装了这个应用程序,并且正在修改策略(policy)文件,请确保正在修改的是
was.policy 文件的正确复件。在安装一个应用程序时,WebSphere 将 EAR 中的所有元数据文件复制到
<install root>/config/cells/<cell name>/applications/<app name>.ear/deployments/<app name> 文件夹中。因此,服务器实际读取的策略文件复件是:
<install root>/config/cells/<cell name>/applications/<app name>.ear/deployments/<app name>/META-INF/was.policy 。请确认这是您正修改的复件。当然,如果您使用新的策略文件来重新安装这个应用程序,一切也将正常运行。
问:我们的 J2EE 应用程序目前正通过我们在内部开发的 LDAPAuthentication 类访问 Domino LDAP Server 进行认证。这一 LDAPAuthentication 类将使用 JNDI API 来搜索 Domino LDAP Server。然而,我们无法使用这个 LDAPAuthentication 类来搜索 Active Directory,因为 Active Directory 不支持 JNDI API。有没有另一个 JAVA API(Active Directory 支持)可供我们用来定制 LDAPAuthentication 类以访问 Active Directory 进行认证?
(由 RS 提出)
答:ActiveDirectory 支持 LDAP 协议,您可以在 Java 中使用标准的 Java JNDI API 来访问它。LDAP 服务器并非真的必须支持 JNDI API,只要支持 LDAP 协议就可以了。如果您有问题,最有可能是关于您打算如何访问 ActiveDirectory 的配置问题。我已经提供了一个简单的测试案例程序来认证一个 LDAP 服务器的识别名。请确认您的 LDAPAuthentication 类与它基本相同。一般情况下,您对待 ActiveDirectory 不必与对待任何其他的 LDAP 服务器有什么不同。
import java.util.Properties;
import javax.naming.*;
import javax.naming.directory.*;
//include the JNDI in the classpath. You should use the same JDK used by WebSphere Application server.
class wasLdapAuth
{
public static void main(String[] args)
{
//***************** user information to be authenticated ********************************
//*****************Please modify the following three properties accordingly ************
String ldapHost= "ldap://cliang1.austin.ibm.com:389"; //ldap host + port number
String DN = "cn=user1, ou=Austin,o=ibm,c=us"; // DN to be authenticated
String password = "security"; // DN's password
//***************** End of user information
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//for websphere 4.0 and 5.0
//props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.jndi.LDAPCtxFactory");
// for WebSphere 3.5 release
props.put(Context.SECURITY_AUTHENTICATION, "simple"); //use simple authentication mechanism
props.put(Context.SECURITY_CREDENTIALS, password);
props.put(Context.SECURITY_PRINCIPAL, DN);
props.put(Context.PROVIDER_URL, ldapHost);
long start = System.currentTimeMillis();
long end=0;
long time =0;
try
{
System.out.println("authenticating");
DirContext ctx = new InitialDirContext(props);
System.out.println("authenticated");
end = System.currentTimeMillis();
time = end - start;
System.out.println( "authentication takes = " + time + " millis");
System.out.println("successfully authenticate DN: "+DN);
}
catch (Exception ex)
{
end = System.currentTimeMillis();
time = end - start;
System.out.println("Exception is "+ex.toString());
ex.printStackTrace();
System.out.println( "authentication takes = " + time + " millis");
System.out.println("fail to authenticate DN: "+DN);
}
}
}
|
问:我想在服务器启动时启动一个程序,这一程序把静态数据装入内存并执行一些其他的查找工作,同时启动一个使用 JDK1.3 计时器的调度程序。在 WebSphere 3.5 中,有一个可以由我的启动类来实现的接口 ServiceInitializer。它的运行情况很好,我的工作也完成了。但在版本 4 及更高版本中,有一个接口 CustomService 必须由启动类来实现。但这样我就无法使用池中的连接,或者无法查找 bean,因为名称服务器没有启动。在 WebSphere 版本 4 中我怎样才能让我的启动类查找 bean 或数据源?我可以使用这个 ServiceInitializer 接口或任意其他备用接口吗?
(由 Kiran K 提出)
答:3.5 版本中的 ServiceInitializer API 已经被 4.0 版本中的 CustomService API 取代了,您可能已经发现了,CustomServices 允许的行为限制更多。CustomService 是在服务器启动工作序列的早期被调用,因此不能访问服务器本身的许多服务。关于 CustomServices 限制的更多信息,请参阅
Developing custom services。遗憾的是,4.0 版本中并没有相应的替代品可以为您提供与 ServiceInitializer 所提供的相同级别的访问。引入这些限制是为了保护服务器运行时,同时也是为了弄清楚初始化代码在服务器中的预期行为。
问:使用 WebSphere Application Server 5.0 创建任何 EJB和 MDB 都必须实现/继承任何特定于 WebSphere 的接口/类或者标准的 EJB 接口吗?它是否有与版本 4.0 中类似的 AccessBean。
(由 RS 提出)
答:您不必为创建 EJB 或消息驱动的 bean(Message-driven bean,MDB)而实现或继承任何特定于 WebSphere 的接口或类。这些是标准化了的组件,是 J2EE 的一部分,您只需继承或实现标准的 EJB 接口类即可。发行版 5.0 仍然支持 WebSphere Studio 工具生成的一种格式的 Access Bean,这种 Bean 可以用来访问包装器 EJB。WebSphere Studio Application Developer 5.0 支持三种类型的 Access Bean:数据类、复件助手和 Java bean 包装器。关于更多信息,请参阅
WebSphere Studio Application Developer 产品文档。
问:我正在使用带 WebSphere Application Server 4.0 的 WebSphere Studio Application Developer 4.0。在 Application Developer 中,我们开发了有状态/无状态会话 bean。每个 EJB 模块有自己的部署描述符。但在 Session Bean 的部署描述符中,缺省情况下没有 Timeout 属性。我们可以在何处设置这一属性?我们是否可以在个别 EJB 模块的部署描述符中设置,或者我们是否需要在 Websphere Application Server 管理控制台中为整个 .EAR 文件设置?请告诉我在何处、如何设置 Timeout 属性以及体现设置细节的精确代码行。
(由 CK 提出)
答:我假设您是在询问有状态会话 EJB 的超时值。WebSphere 提供了一个扩展允许您在
ibm-ejb-jar-ext.xmi 文档中通过会话 bean 指定超时值。您可以在 AAT 中或 Application Developer 中指定该值。在 Application Developer 中,您可以在 EJB Deployment Descriptor 编辑器的
Beans选项卡上指定此值。选择您希望编辑的会话 bean,向下滚动,然后您将在这张页面的 WebSphere Extensions 部分下看到
Session Timeout属性。
问:除 Transaction TimeOut 和 Session bean TimeOut 之外,Websphere 4.0 还支持哪些不同的 TimeOut 属性?在我的项目中,客户机将获取无状态会话 bean 的句柄,这个句柄充当一个虚包,在事务感知环境中的工作流中调用几个无状态和有状态会话 bean。因此在这种情况下,会话的 TimeOut 值是否应该被设置为大于事务的 Timeout 值?另外,无状态会话 bean 的 TimeOut 值是否应该设置得比它调用的 bean 的 TimeOut 值大得多?如果是,这个超时值最理想的最大值(max_value)可以设置为多少?在上面所说的情况下,是否有设置超时值时所需的算法?
(由 CK 提出)
答:并没有什么简单算法可供您应用。一般情况下,bean 的超时值要比单个事务的超时值更大。对于您所说的情况 - 您的无状态会话 bean 调用一组其他的会话 bean,正确的超时值要取决于这些 bean 之间的关系。如果所有的 bean 实例被一起创建并且被放在一起,那么所有的 bean 有同样的超时值,因此它们几乎可以同时超时。然而,如果被包含的 bean 与调用它们的 bean 的生命周期不同,就应该分别为每个 bean 适当地设置超时。
问:我们的高等教育机构实行了一项大学学前教育计划,名为国际科学与技术展(Internet Science and Technology Fair)。学生团队使用 IT 工具与在线科学家和工程师合作完成他们的研究工程。他们最终的研究报告做成 Web 站点格式,然后由国家评审小组来评估。在执行了这项计划六年后,显然我们需要一个门户解决方案来帮助使虚拟团队成为可能。这些团队在四个月的竞争期间进行研究、合成、交流、开发和报告时需要合作。WebSphere Application Server(只是臆测)好象刚好能满足这种需要。您或 IBM 中的某人是否有可能愿意帮助我们构建一个 WebSphere 教育应用程序?这将需要支持数千名将探索技术生涯中的机会作为他们的目标的学生。我们在资源方面几乎一无所有,但希望您对这种性质的项目感兴趣。
(由 BF 提出)
答:我很乐意帮助您与 IBM 的人取得联系,或许他们能够提供些帮助或者贡献些什么东西。请通过 WSDD 客户支持联系中心用
wsdd@us.ibm.com与我联系。
问:在 Solaris 操作系统上的 Websphere Application Server 高级版 4.0 中部署了一个 .ear 文件之后,每当访问应用程序时,它就会用“?”这个字符替换所有的特殊字符(Ü、^、¢、£)。这些特殊字符被用于连接字符串,在分隔字符串的时候也会用到上面提到的特殊字符集。它们在每个实例中被当作“?”。WebSphere Application Server 高级版在 Solaris 操作系统下运行时会出现这种问题,但 WebSphere Application Server 在 Windows NT 下运行时却没这种问题。
(由 Raja Ravindra 提出)
答:我以前从未听说过这种问题。遗憾的是,如果没有关于这些字符位于什么地方以及您打算如何处理它们的更多信息,我无法真正提供多少帮助。这些字符是在被发送到应用程序服务器的 URL 中吗?它们是不是请求的参数?这种替代何时发生?当然,这听起来是一个很有趣的问题。您可以通过
wsdd@us.ibm.com把详细情况发送到 WSDD 客户支持。
关于作者  | |  | Jason McGee has authored this article |
对本文的评价
|