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

developerWorks 中国  >  Grid computing  >

基于标准的网格门户开发,第 2 部分: JSR 168 网格 portlet

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 中级

Xiaobo Yang (x.yang@dl.ac.uk), 软件开发人员, Consultant
Xiao Dong Wang (x.d.wang@dl.ac.uk), 高级软件开发人员, Consultant
Robert Allan (r.j.allan@dl.ac.uk), 小组负责人, Consultant

2007 年 6 月 22 日

构建于网格中间件之上的网格门户担当着网格大门的角色,因为它们使人们能更顺利地学习使用网格。在共分三部分的 “基于标准的网格门户开发” 系列的第 1 部分中,我们将对网格门户作一个总体介绍,重点讲述当前基于标准(JSR 168 和 WSRP 1.0)的第二代网格门户。在本文中,我们将开发 3 个 portlet 来阐述如何使用与 JSR 168 兼容的 portlet 构建网格门户。而第 3 部分将展望 Web Services for Remote Portlets(WSRP)应用程序和网格门户的未来。

所需技能

在测试样例网格 portlet 之前,您应该熟悉以下技术:

  • Java™ 开发环境 —— 使用了 Sun JDK V1.5.0_10;这些代码与 JDK V1.4 兼容,并使用 JDK V1.4.2_08 成功编译
  • Servlet/JSP 开发
  • 门户框架 —— 使用了 uPortal V2.5.3 快速启动;其他门户框架包括 eXo platform V1.0、GridSphere V2.0.2、Liferay professional V3.6.1 和 StringBeans V2.4.2,全部经过测试。
  • 网格和 Globus Toolkit —— 使用了 GT V2.4;如果您想要使用 GT V3.x/4.x,在适当的地方修改 utility/JobSubmissionPortlet 类。
    • 网格安全基础设施(GSI)
    • MyProxy
    • Globus 资源分配管理器(GRAM)
    • 元计算目录服务(MDS)
    • Java CoG,使用的是 cog-jglobus V1.4

Java 和 servlet/JSP 开发技巧对于编写 portlet 来说是必须的。LdapBrowser portlet 并不需要对 GSI 进行认证和授权,因为 MDS 服务器通常都是公开的。对于网格示例来说,您需要很好地理解 GSI、MyProxy 和 GRAM。如果您想要测试 ProxyManager 和 JobSubmission portlet,那么除了 CA 根证书之外,还需要用户和主机证书。您需要在 Java CoG 设置过程中设置好所有这些参数。在部署网格 portlet 之前,请确保您可以运行 Java CoG 命令行脚本。另外,您还需要访问一个 MyProxy 服务器和 GRAM gatekeeper。本文所述的示例是在 Linux® 上开发并部署的,不过应该也可以在 Windows® 上运行。还要注意可能出现的防火墙问题。





回页首


使用 Java CoG 编写网格 portlet

JSR 168 portlet

PortletSession —— 来自于 JSR 168
  • PortletSession 接口定义了两个存储对象的范围:APPLICATION_SCOPEPORTLET_SCOPE
  • 使用 APPLICATION_SCOPE 存储在会话中的任何对象可以用于任何其他属于相同的 portlet 应用程序的 portlet,还可用于处理被标识为相同会话一部分的请求的 portlet。
  • 在请求存储对象的相同 portlet 窗口时,使用 PORTLET_SCOPE 存储在会话中的对象必须可用于 portlet。

有大量教程(请参看 参考资料)可以指导您开发 JSR 168 portlet。本文给出了一些一般性说明,而没有详细介绍每个步骤。

每个 portlet 应用程序都是一个 Web 应用程序。一个 portlet 应用程序内部可能有多个 portlet。这对于网格 portlet 来说非常重要,因为一个 portlet 应用程序中的 portlet 可以共享一个应用层会话。当用户使用 ProxyManager portlet 从 MyProxy 服务器检索一个代理凭证时,当用户使用 ProxyManager portlet 从 MyProxy 服务器检索一个代理凭证时,JobSubmission portlet 需要使用到凭证,这样就可以代表用户将作业提交到一个远程计算节点上。

现在,我们可以将两个 portlet 放到一个 portlet 应用程序中,从而共享代理凭证。实际上,代理凭证也可以存储到数据库中。这样,就不用将多个 portlet 放到一个 portlet 应用程序中了。然而,在本文示例中,将所有 portlet 都放到一个 portlet 应用程序中可以让代码更加容易阅读,因为与数据库有关的代码都已经被删除了。

我们要开发的第一个 portlet 是 LdapBrowser portlet,它用来查询 LDAP/MDS 服务器以获得有关虚拟组织(VO)内部网格资源的信息。尽管不需要与其他两个 portlet 共享一个凭证,这个 portlet 还会被放在一个名为 “grid” 的相同 portlet 应用程序中。portlet 本身包含以下源文件和图像文件。请注意此处的 web.xml 和 portlet.xml 都可以被其他两个 portlet 共享。如果您查看一下这些源文件,就会发现在诸如 exouportal 之类的目录下有几个 web.xml 文件。这是因为每个门户框架都有自己的机制来加载 portlet 应用程序。还要记住每个门户框架都有自己的标记文件来为 portlet 库实现标记。实际上,在不同的 portlet 框架中部署 portlet 时,需要做的惟一一件事情是替换 web.xml 文件和 portlet 标记文件。源代码和图像文件如下:

  • src/uk/ac/clrc/escience/ngsportlets/ldapbrowser/LdapBrowserPortlet.java
  • src/uk/ac/clrc/escience/grid/util/LdapNodeAttribute.java
  • src/uk/ac/clrc/escience/grid/util/LdapNodeLink.java
  • web-content/jsps/ldapbrowser-edit.jsp
  • web-content/jsps/ldapbrowser-help.jsp
  • web-content/jsps/ldapbrowser-view.jsp
  • web-content/WEB-INF/web.xml
  • web-content/WEB-INF/portlet.xml

portlet 遵循模型-视图-控制器(MVC)设计模式。正如您可以从上面的列表中看到的一样,LdapBrowserPortlet portlet 有 3 个视图页面:ldapbrowser-edit.jsp、ldapbrowser-help.jsp 和 ldapbrowser-view.jsp —— 它们表示这个 portlet 支持的 3 种模式。portlet 所支持的模式是在 portlet 应用程序配置文件(portlet.xml)中定义的。它还有其他一些设置,例如 supported-locale,不过最重要的是, portlet-preferences 会设置 portlet 的初始首选项。portlet 的一个关键特性是不同用户可以为同一个 portlet 设置不同的首选项。例如,我们为 LdapBrowser portlet 定义了 3 个首选项: ldap_hostnameldap_hostportldap_basedn。portlet 的编辑模式是为设置用户自己的首选项而设计的。

LdapBrowserPortlet 类有一个如清单 1 所示的结构。init 方法用来对 portlet 进行初始设置。例如,在 LdapBrowser portlet 中,这个方法用来加载这 3 个 jsp 页面的 URL。尽管没有在清单 1 中进行定义,destroy 方法可以用来执行一些清理工作,例如在 portlet 消失之前关闭数据库连接。processAction 负责处理来自终端用户的操作请求,而这三个 doXxx 方法是与这个 portlet 的不同模式有关的。核心业务逻辑位于 doGetldapinfo 方法中,它会使用从用户界面中收集的参数执行 LDAP 查询。


清单 1. LdapBrowserPortlet 类的结构
                
public class LdapBrowserPortlet extends GenericPortlet {
  public void init(PortletConfig pConfig) throws PortletException {
  }

  public void processAction(ActionRequest request, ActionResponse response)
                                        throws PortletException, IOException {
  }

  public void doView(RenderRequest request, RenderResponse response)
                                        throws PortletException, IOException {
  }

  public void doEdit(RenderRequest request, RenderResponse response)
                                        throws PortletException, IOException {
  }

  public void doHelp(RenderRequest request, RenderResponse response)
                                        throws PortletException, IOException {
  }

  private void doGetLdapInfo(ActionRequest request, ActionResponse response)
                                        throws PortletException, IOException {
  }

}

Java CoG 提供了一个基于 Java 的 GSI 实现、GridFTP、MyProxy、GRAM 客户机等。有了 Java CoG 的帮助,网格应用程序开发人员可以使用高级 Java API 来创建并检索代理凭证,将作业提交给远程的 GRAM gatekeeper,并使用 GridFTP 和其他工具来执行文件传输。由于这个原因,Java CoG 成为如今基于 GT 的网格门户的基础。

现在,我们将开发另外两个网格 portlet:ProxyManager 和 JobSubmission。前者可以用来从 MyProxy 服务器检索并更新凭证,并将其保存到会话中;后者用来将作业提交到远程 GRAM gatekeeper。JobSubmission portlet 将从会话中检索代理凭证,因为本文示例中,这两个 portlet 都属于相同的 portlet 应用程序。

如果您查看一下源代码,会发现在 uk.ac.clrc.escience.grid.util 包中有一组类。例如,ProxyUtil 和 GRAMJob 具有为 ProxyManager 和 JobSubmission portlet 实现的核心业务逻辑。这种方法使得测试业务逻辑非常简单。另外,业务逻辑可以作为 Web 服务发布,从而最大程度实现代码可重用性。portlet 开发人员就可以专注于表示层的实现。





回页首


编译、部署和测试网格 portlet

Portlet 模式和窗口状态

JSR 168 规范定义了 3 种模式:查看、编辑和帮助。查看模式可以用来呈现 portlet 的构成。可选的编辑和帮助模式被定义为为实现定制化和呈现 portlet 帮助信息而提供用户界面。JSR 168 还允许定义特定于供应商的模式。

JSR 168 还定义了 3 个窗口状态:普通最大化最小化,用来表示分配给 portlet 生成的内容的门户页面空间大小。与 portlet 模式类似,JSR 168 允许特定于供应商的窗口状态。

LdapBrowser、ProxyManager 和 JobSubmission portlet 的源代码可以从 下载 一节中下载。解压缩之后,进入 GridPortlet 目录,并阅读 readme.txt 文件获得指导说明。

通常,在编译网格 portlet 之前,先查看一下 build.properties 文件,并下载所需要的库,包括 Java CoG V1.4、JDOM V1.0、servlet 和 portlet API,并将它们放到 lib 目录下。另外,还需要将 build.properties 中的 portlet-container.home 参数设置为指向 Tomcat,也就是安装门户框架的位置。现在您已经准备好编译并部署代码了。输入 ant,就可以获得所有可用的选项。例如,要编译和部署 uPortal 中的 portlet,请使用下面的命令:

  • ant build
  • ant war.uportal
  • ant deploy.uportal

如果一切顺利,您可以启动自己的 uPortal,并在将它们添加到一个门户页面之前发布这 3 个 portlet。有关在 uPortal 中发布和部署 portlet 的更多信息,请参考 uPortal 用户指南。在发布 portlet 时,请检查 uPortal 中 Portlet Definition ID 的设置。这个参数在 web.xml 中被定义为每个 portlet 的 portlet-guid。在本文示例中,我们将它们分别定义为 grid.LdapBrowserPortletgrid.ProxyManagerPortletgrid.JobSubmissionPortlet。图 1 给出了一个名为 Grid Portlet Examples 的标记,具有 3 个已开发的 portlet。对于 LdapBrowser portlet,使用编辑模式将默认用户名 “tom” 修改为 “xiaobo”。


图 1. uPortal 中部署的网格 portlet
uPortal 中部署的网格 portletl

在测试 ProxyManager 和 JobSubmission 之前,请从 CA 获得一个用户证书和一个主机证书。用户证书用来将长期代理凭证上载到一个 MyProxy 服务器上,可以使用 ProxyManager portletl 从这个服务器上检索短期代理凭证。这就是网格门户广泛使用的安全过程。ProxyManager 需要使用主机证书,这样它就可以对发出代理凭证请求的服务器进行认证。主机证书和私钥被硬编码在 uk.ac.clrc.escience.grid.util.PortalCredential,分别是 “/etc/grid-security/hostcert.pem” 和 “/etc/grid-security/hostkey.pem”。如果您将它们保存到了不同位置,可以在 PortalCredential 类中修改设置,或者调用下面的代码:

public static GSSCredential getProxyCredential(String myproxy_host, int myproxy_port, String myproxy_username, String myproxy_password, int lifetime_in_second, String hostcert, String hostkey)

而不是使用下面这个来自 ProxyManagerPortlet 中 ProxyUtil 的方法:

public static GSSCredential getProxyCredential(String myproxy_host, int myproxy_port, String myproxy_username, String myproxy_password, int lifetime_in_second) .

在开始测试 ProxyManger 和 JobSubmission portlet 之前,最后一步是将长期代理凭证上载到您的 MyProxy 服务器上。这可以使用下面的 Java CoG 命令实现:

$COG_INSTALL_PATH/bin/myproxy -h MyProxy_server -p MyProxy_port put

现在您已经准备好测试这两个 portlet 了。首先使用 ProxyManager 来检索一个短期代理凭证。由于该凭证保存在一个会话中,JobSubmission portlet 会自动将其挑选出来,这样作业就可以通过远程 GRAM gatekeeper 提交到一个网格资源。图 2 显示了有关代理凭证和已提交作业的信息。


图 2. 已经成功提交给远程 GRAM gatekeeper 的作业
已经成功提交给远程 GRAM gatekeeper 的作业

JobSubmission portlet 还将作业信息记录到 grid/WEB-INF 目录中一个名为 jobs.xml 的 XML 文件中。刚刚提交的作业已经被记录下来,如清单 2 所示。在网格门户的产品版本中,这样的信息可能被记录到数据库中供将来使用。要构建一个有用的网格门户,显然需要更多功能。例如,基于 GridFTP 的文件传输功能必不可少。可以根据自己的需要开发网格门户,并实现共享。


清单 2. 记录在 jobs.xml 中的作业
                
<?xml version="1.0" encoding="UTF-8"?>
<ngsbatchjobs>
  <batchjob>
    <dn>C=UK,O=eScience,OU=CLRC,L=DL,CN=xiaobo yang,CN=proxy,CN=proxy,CN=proxy</dn>
    <date>1165582518358</date>
    <jobid>https://grid-compute.oesc.ox.ac.uk:64493/27245/1165582519/</jobid>
    <hostname>grid-compute.oesc.ox.ac.uk</hostname>
    <jobmanager />
    <executable>/bin/ls</executable>
    <arguments>-l</arguments>
    <directory />
    <stdin />
    <stdout>ls.out</stdout>
    <stderr />
  </batchjob>
</ngsbatchjobs>





回页首


结束语

分享这篇文章……

digg 将本文提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot 提交到 Slashdot!

通过使用本系列文章 第 1 部分 网格门户回顾中介绍的信息,我们开发了 3 个 portlet:LdapBrowser(用于 LDAP/MDS 查询)、ProxyManager(用于为终端用户检索和更新代理凭证)、JobSubmission(用于代表用户将作业提交到远程 GRAM gatekeeper)。一个有效的网格门户通常允许 MyProxy 登录来对门户本身进行认证。这涉及修改诸如 StringBeans 之类的门户框架,我们在 NGS Portal 的 release 2 中实现了这一点。需要自动将 MyProxy 认证过的用户映射到一个本地门户用户,这样就可以支持所有的门户功能。

在 “基于标准的网格门户开发” 系列文章的第 3 部分中,我们将讨论在 WSRP 方面的经验,并展望网格门户的未来。






回页首


下载

描述名字大小下载方法
源代码gr-stdsportal2.GridPortlet.zip2MBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术
  • Globus Toolkit 是启用网格的实际标准实现。

  • Java Commodity Grid (CoG) Kits 允许网格用户、应用程序开发人员和管理人员从较高层次框架上使用、管理网格,并对网格进行编程。它提供了基于 Java 的 GSI 实现、GridFTP、MyProxy、GRAM 客户机以及附加功能。

  • MyProxy 是 NCSA 用于管理 X.509 Public Key Infrastructure (PKI) 安全凭证(证书和私钥)的一个开源软件。

  • 请查看 eXo Portal,它可以帮助您使用安全基础设施构建一个集成解决方案,尤其可用于开发一个有效的门户。

  • GridSphere 是一个门户框架,它提供了开源的基于 portlet 的 Web 门户。

  • Liferay 是一个企业开源门户框架。

  • uPortal 是一个免费的共享开源门户,由高等教育机构开发。


作者简介

 Xiaobo Yang

Xiaobo Yang 是一名软件开发人员,就职于英国 CCLRC e-Science Centre 的 Grid Technology Group。他对网格、协作虚拟研究环境和各种 Web 技术(包括网格门户技术),以及面向服务的架构(Service-Oriented Architecture,SOA)都有着浓厚的兴趣。


Xiao Dong Wang

Xiao Dong Wang 是一名高级软件开发人员,就职于英国 CCLRC e-Science Centre 的 Grid Technology Group。他所感兴趣的领域有:网格中间件设计、应用程序、门户用户接口、portlet 开发、JSP 和 JSF。他在 Java 编程、Web 和网格服务开发方面有超过六年的经验。


Robert Allan

Robert Allan 是英国 CCLRC e-Science Centre 的 Grid Technology Group 的小组负责人。他原来是一名物理学家,自从 20 世纪 80 年代以来,致力于使用最新技术开发高性能的计算应用程序。他在英国管理几个大型的 HPC 和 e-science 项目。他对如何使网格得到广泛使用有浓厚兴趣。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


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