级别: 中级 Ramakrishnan Kannan (rkrishnan@in.ibm.com), 高级软件工程师, IBM India
2008 年 6 月 12 日
Mashups 是 Web 2.0 的一个关键组件,它集成多个应用程序的 feed 来生成新的内容。由于目前许多核心的企业级商用程序都在大型机上运行,要使 mashup 能够在企业中成功运行,必须把大型机的内容交付为 feed。本文提供了一个循序渐进的指南,使用 IBM® WebSphere® Host Access Transformation Services (HATS) 生成大型机内容的 Atom feed。
 |
常用缩略语
- DOM:文档对象模型(Document Object Model)
- GUI:图形用户界面(Graphical User Interface)
- RSS:真正简单的连锁(Really Simple Syndication)
- XML:可扩展标记语言(Extensible Markup Language)
|
|
现在,内容分配器把所有内容(包括新闻和站点更新)交付为 feed。大部分企业应用程序都将 feed 用于不同用途,包括监视应用程序和检查项目状态。内容提供者在他们的站点上发布一个 feed 链接,用户使用 feed 阅读器在该站点注册。这些 feed 阅读器定期检查注册的 feed 的更新。当它检测到内容中有更新时,feed 阅读器向内容提供者请求更新的内容。
这些 feed
只包括内容的摘要,但它们提供一个到详细的内容的链接,Atom Syndication Format 和 RSS 是最流行的 feed 规范。我们在本文中使用 Atom feed,但您只要稍作修改就能够轻松地更改为 RSS feed。
 |
RSS/Atom 的历史
RSS 是 Resource Description Framework (RDF)(Netscape 内部的一种 XML 格式)和
Scripting News(Userland Software 创立者 Dave Winer 创建的 Weblog)的结合体。不同 RSS 版本之间的不兼容促使 Ben Trott(Six Apart 的共同创立者)第一个提倡使用 Atom feed。
|
|
大多数 500 强企业的应用程序和数据都由大型机托管。在将大型机中的内容交付为 feed 是一项挑战,但这是在企业中成功采用 Web 2.0 的关键。
为了应对这个挑战,必须有一种工具或编程方法能在将大型机中标识的内容交付为 Atom/RSS feed。本文利用一个称为 IBM WebSphere Host Access
Transformation Services (HATS) 的产品,该产品将任何给定的绿屏(green-screen)或基于字符的 3270 或 5250 主机应用程序转换成 Web 应用程序(HTML)或富客户机应用程序。HATS 还允许可编程界面把这些主机应用程序中标识的内容转换为其他的格式。我们将要采用一种循序渐进的方法,向您展示如何编写一个 HATS
程序,该程序将主机应用程序的内容转换为 Atom fees。图 1 展示了这个解决方案的鸟瞰视图。
图 1. HATS-Atom 解决方案的鸟瞰视图
要创建这个解决方案,您需要以下产品:
-
IBM Rational® Software Delivery Platform:这个中间件产品能帮助您使开发过程自动化。
-
HATS:使用 HATS 创建 Web 和副客户机应用程序,该应用程序为基于字符的 3270 和 5250 主机应用程序提供一个 GUI。
-
Apache Abdera (可选的):Abdera 是 Internet
Engineering Task Force (IETF) Atom Syndication
Format 和 Atom Publishing Protocol 规范的一个实现。
HATS 运行时代码在部署在 IBM® WebSphere® Application Server 上的一个或多个应用程序内部运行,并且在用户与主机应用程序之间来回传递数据。Feed 阅读器与 HATS 应用程序交互。开发一个能交付 feed 的 HATS 应用程序后,您可以使用部署任何其他应用程序的方法将其部署到 WebSphere Application Server。
 |
大型机剪影
“我预测大型机将会在 1996 年 3 月 15 日停产。” —— Stewart Alsop,InfoWorld,1991 年 3 月。 IBM 于 2008 年 2 月发布其最新 System z10 大型机。
|
|
当 feed 阅读器检查启用 feed 的 HATS 应用程序时,HATS 应用程序触发后端主机应用程序,HATS 应用程序从这个后端主机应用程序收集内容。一个配置文件(称为 HATS 宏)定义主机应用程序屏幕必需的
数据。HATS 应用程序从屏幕收集所需的数据,并且通过一个变量(称为 HATS 全局变量)将其变为可用。然后它触发一个程序(称为 HATS 业务逻辑)并移交收集的数据。您可以使用 Atom feed 库根据收集的数据构造 feed,然后将这些 feed 交付给 feed 阅读器。
利用 HATS 宏配置文件,您可以在多个主机屏幕上进行可编程的导航。例如,它可以导航一个主机应用程序屏幕来显示用户需要看到的第一个屏幕,省略中间的所有屏幕。HATS 运行时收集并存储这些全局变量的数据。它从主机屏幕提取数据并把数据输入其他屏幕。HATS 业务逻辑程序使用 Atom feed 库构造 feed。图 2 能帮助您理解这个解决方案的流程。
图 2. 解决方案流程概述
标识一个业务过程并记录一个宏
首先,你需要为一个已标识的业务过程创建一个 HATS 项目并记录一个宏。在 HATS 在线帮助文件中,您可以找到使用 HATS 宏的详细过程。
我们在大型机上使用一个称为 Echo 的应用程序,它能对输入第一个屏幕的输入文本进行回显。为了便于演示,我们使用文本 “Hello World” 作为在下一个屏幕中回显的输入。
图 3
展示了 Echo 的主屏幕,用户在标题 “ENTER DATA TO ECHO BELOW” 下边输入数据。用户输入字符串 “Hello World!!!”,通过在一个 HATS 全局变量中设置这个值,您可以将输入改变成任何特定的字符串。
图 3. Echo 程序的输入屏幕
图 4
显示用户输入的数据。与 图 3 的输入相对应,“Hello World!!!” 被作为输出显示。提取这个输出并将它公开为 Atom feed。
图 4. Echo 程序的输出屏幕
您可以把 Echo 程序当作一个业务过程,并且可以记录一个宏。这个宏自动运行并从大型机的应用程序收集相关数据,无需任何用户干预。使用 HATS 的屏幕定制功能,您可以配置 HATS 在检测到应用程序的第一个屏幕时运行宏。图 5 展示如何将宏链接到
应用程序入口屏幕。
图 5. 程序入口屏幕上的屏幕定制
单击 New Screen Customization 弹出 Screen Customization 向导,在此处已记录的宏被链接到屏幕,如
图 5 所示,在运行期间,这个宏在 HATS 检测到入口屏幕时自动运行。
图 6
展示了在运行期间若 echoFeeds 宏与 图 5 中的应用程序入口屏幕匹配,echoFeeds 宏将被触发并回放。
图 6. 配置自动播放宏
添加业务逻辑
您需要创建包含代码的业务逻辑,以将业务过程的输出公开为 Atom
feed。像 Atom feed 规范中说明的一样,业务逻辑使用常规的 XML 库创建 Atom feed。或者,您可以使用 Atom feed 库,比如 Apache Abdera,使用后者比使用 XML 库要求更少的代码。但是,IBM Rational Software Delivery Platform 没有捆绑这些库或他们所需要的从属库。
首先创建一个业务逻辑,当您通过宏从大型机应用程序收集所有必要的数据时,这个业务逻辑会被触发。进入 HATS Studio 并单击 File > New > HATS Business Logic,如
图 7 所示。
图 7. 创建新的业务逻辑
图 8
展示了 Create Business Logic 向导,您可以看到 AtomFeeds 是包含业务逻辑的 Java™ 文件的名称。它可以属于某个包,但为简明起见,此处 AtomFeeds 属于默认包。
图 8. Create Business Logic 向导
接下来,在 HATS 项目的 Java Source 文件夹下创建一个名为 AtomFeeds.java 的 Java 文件。HATS 自动生成代码。将执行业务逻辑所需的代码添加到
execute
方法中。接下来,如
清单 1 所示,在这个生成的业务逻辑的
execute() 方法中添加代码来交付 Atom feed。
清单 1. 业务逻辑中的 Atom feed 代码
IResponse response = blInfo.getResponse();
String outputValue=blInfo.getGlobalVariable("output").getString("outputValue");
try
{
OutputStreamWriter responseStream = new OutputStreamWriter(response.getOutputStream());
try
{
DocumentBuilderFactory feedFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder feedBuilder = feedFactory.newDocumentBuilder();
Document doc = feedBuilder.newDocument();
Element root = doc.createElementNS("http://www.w3.org/2005/Atom",feed);
doc.appendChild(root);
Element title = doc.createElement("title");
root.appendChild(title);
Text titleText = doc.createTextNode("Sample Feed from HATS");
title.appendChild(titleText);
//in similar lines add updated and summary element
Element updated = doc.createElement("updated");
root.appendChild(updated);
Text updateText = doc.createTextNode(new Date().toString());
updated.appendChild(updateText);
Element summary = doc.createElement("summary");
root.appendChild(summary);
Text summaryText = doc.createTextNode("This has the feeds from zSeries");
summary.appendChild(summaryText);
Element entry = doc.createElement("entry");
root.appendChild(entry);
Element titleEntry =doc.createElement("title");
titleEntry.setTextContent("I am first Entry");
entry.appendChild(titleEntry);
Element link=doc.createElement("link");
link.setAttribute("href", "http://www.ibm.com");
entry.appendChild(link);
Element id=doc.createElement("id");
id.setTextContent("urn:test-test");
entry.appendChild(id);
Element updatedEntry = doc.createElement("updated");
entry.appendChild(updatedEntry);
Text updateEntryText = doc.createTextNode(new Date().toString());
updatedEntry.appendChild(updateEntryText);
Element summaryEntry = doc.createElement("summary");
//The next line sets the output from mainframe as summary in Atom Feed
summaryEntry.setTextContent(outputValue);
entry.appendChild(summaryEntry);
TransformerFactory feedTransformerFactory = TransformerFactory.newInstance();
Transformer feedTransformer = feedTransformerFactory.newTransformer();
feedTransformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes");
feedTransformer.setOutputProperty(OutputKeys.INDENT,"yes");
StringWriter sw = new StringWriter(); StreamResult
result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
feedTransformer.transform(source,result);
String xmlString = sw.toString();
//The next line delivers the constructed Atom feed to feed reader
responseStream.write(xmlString);
} catch (Exception e) { System.out.println(e); }
responseStream.close();
} catch (IOException e) { e.printStackTrace();
}
|
最后,根据 Atom feed 规范使用 XML 创建一个 DOM 结构,并将其添加到业务逻辑 Java 文件 AtomFeeds 的
execute()
方法中。这是实现业务逻辑目标的关键。
定制屏幕以触发业务逻辑
现在需要在宏结束后触发这个业务逻辑。使用 Screen Customization 向导来定制 图 4 的屏幕,然后触发业务逻辑 AtomFeeds 使其执行。图 9 展示了 Screen Customization 向导,添加
triggerBusinessLogic 到 HATS 项目的 Screen Customizations 文件夹下。
图 9. 触发业务逻辑
选中 Add advanced actions,如 图 10 所示,以使这个向导的下一个屏幕提供一种触发业务逻辑 AtomFeeds.java 的方法。
图 10. 触发业务逻辑的中间步骤
在 Add Action 向导中选择单选按钮 Execute business logic,如 图 11 所示。
图 11. 为业务逻辑定制屏幕
指定 AtomFeeds 作为包含业务逻辑的类名,如
图 12 所示。这与在 图 8 中创建的新业务逻辑的名称相同。
图 12. 配置业务逻辑类
现在完成了这个循序渐进的过程,该过程使用 HATS 交付大型机应用程序的 Atom feed。接下来将 HATS 项目部署到 WebSphere
Application Server。为了测试这个项目,将其部署到 Integrated Test Environment 中。
Integrated Test Environment 与 IBM Software Development Platform 绑定。在其中部署该应用程序的 URL 将是 feed 阅读器的 URL。默认情况下,URL 一般是 http://servername/<HATSProjectName> 格式。
使用 feed 阅读器测试输出
向 Application Server 提供 HATS 应用程序部署到的 URL(如 图 13 所示)。
图 13. feed 阅读器中的 Atom feed 服务器配置
收集来自大型机应用程序的输出 “Hello World” (见 图 4)将其转变为 Atom feed 的一个摘要,如 图 14 所示。
图 14. 大型机应用程序数据的 Atom feed
结束语
 |
Mashup 编辑器
著名的商业 mashup 编辑器包括 IBM Mashup
Starter Kit、Google Mashup Editor、Yahoo! Pipes 和 Microsoft® Popfly™。
|
|
在大型机中将数据交付为 Atom feed 传递开辟了企业应用程序可能性的新纪元。组织可以使用 mashup 编辑器通过外部和内部的 feed 从公司提取数据,然后创建新的应用程序或信息。例如,呼叫中心能够利用 mashup,把正在呼叫的客户
的 ZIP 编码信息传递给 Google Maps 来确定用户的位置。通过询问用户所在位置的天气等信息能够帮助呼叫中心的雇员个性化每个对话。在大型机服务器中,将数据交付为 Atom feed 是推动组织使用 Web 2.0 基本的建构基础之一。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Ramakrishnan Kannan 在班加罗尔的 IBM India Software Laboratory 从事主机集成方面的工作。他曾担任过 IBM 个人通信和通信服务器产品方面的开发人员。除承担开发工作外,他还与 IBM 亚太区的客户合作开展为主机应用程序启用 Web 服务方面的工作。他曾为 Infosys 等 developerWorks 的业务合作伙伴举办过旨在提高 Web 服务意识的培训。他是 IBM 认证的 XML 解决方案开发人员及 Sun 认证的 Java 程序员。他感兴趣的领域包括主机集成、分布式机算、SOA 和网络。 |
对本文的评价
|