站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题Eclipse Communication Framework 入门

Eclipse Communication Framework 入门

摘要: Eclipse Communication Framework(ECF)是一个新的 Eclipse 项目,目的是提供一个开放源码框架,支持在 Eclipse 平台上创建基于通信的应用程序。本文将研究 ECF、它的基本功能和它未来的方向。

背景

最简单地说,ECF 项目的目的就是提供一个跨协议的 API。ECF 将为四类支持者创造价值:

通信供应者
—— 为基于 Eclipse 的应用程序和插件实现新的和现有的通信供应者(Yahoo、AIM 等)的插件开发人员。
价值 —— 互操作性。开发人员和用户允许他们的应用程序跨协议地协同工作。
组件开发人员
—— 实现通用组件级特性(例如,文件共享或白板共享)的插件开发人员。
价值 —— 可重用性。应用程序设计师现在可以重用组件,只要供应者的实现支持重用。
工具集成人员
—— 把现有应用程序与 ECF 技术进行集成以便增加新价值的插件开发人员。一个好示例就是给图形编辑器添加协同支持。
价值 —— 丰富的特性。开发人员可以通过 ECF 把新东西添加到他们的应用程序中。
用户界面(UI)开发人员
—— 构建或集成用户界面的插件开发人员。ECF 提供了干净的骨架,所以可以为聊天室、文件共享等提供自己的用户界面。
价值 —— 可用性。可以独立于底层实现,在设计甚至集成方面改进用户界面或定制用户界面。

ECF 为了满足这个目标提供了一套高级抽象,而不是另一套消息 API。这一设计选择使得可以在不同的应用程序上下文环境和用户界面中重用高级通信组件(即时消息、文件共享、视频会议等)。假设要开发一个应用程序,需要即时通信、博客、BT 下载、文件共享和语音会议。那么使用 ECF 开发可以跨越每个服务的通信代码,从而让开发人员可以专注于业务逻辑和用户界面。


<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

安装 ECF

ECF 是作为一套 Eclipse 插件安装的,通过标准的插件安装过程进行:

ECF 项目还有一个包含额外的供应者和应用程序示例(IRC、JMS 等)的服务器:


<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

ECF 甜头

我们相信,一点儿甜头对于任何文章的成功都至关重要(必须保持读者的兴趣)。图 1 显示的示例 ECF IRC 供应者演示了这个框架的一些聊天室功能。图 2 显示了两个消息连接的示例好友列表视图。







现在已经看到了 ECF 的样子,可以进一步讨论细节了。


<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

ECF 适配器

理解 ECF 工作方式的第一步是快速地查看它的 API,特别是适配器。在 ECF 中,基本的构建块是 IContainer 实例的通信容器。IContainer 实例提供了 ECF 中通信的公共接口。它可以代表某个通信上下文的实例,可以是客户-服务器型的通信模型,也可以是出版-订阅型的通信模型。

IContainer 是 ECF 中的一个重要接口,它通过熟悉的 Eclipse IAdaptable 接口提供的可扩展性也至关重要。因为 ECF 容器是 IAdaptable 的,支持运行时可扩展性,所以可以查询运行时实例的功能,并对实例进行操作。ECF 上下文的功能示例包括在线/聊天、聊天室等。下表列出了 ECF 中的公共功能。

<table border="0" cellpadding="0" cellspacing="0" class="data-table-1" summary="Common ECF capabilities" width="">公共 ECF 功能<tr><td class="tb-row">IPresenceContainer</td><td class="tb-row">公开设置在线消息(离开、可用等等)、文本消息订阅请求侦听器的功能。这个接口的良好实现可以是任何聊天消息协议(Yahoo、AIM、Gadu Gadu 等)。</td></tr><tr><td class="tb-row">ISharedObjectContainer</td><td class="tb-row">公开构建任意通信协议的功能,提供了传递任意信息的能力。</td></tr><tr><td class="tb-row">IDiscoveryContainer</td><td class="tb-row"> 公开了对查找和发现设施(IP 网络上的计算机、设备和服务)的支持能力。Apple 的 Bonjour 是这个适配器的实现者的一个良好示例。</td></tr><tr><td class="tb-row">IChatRoomManager</td><td class="tb-row"> 公开在 ECF 中支持聊天室的功能。这个接口的示例实现是支持聊天室的协议(Yahoo、XMPP、IRC 等)。</td></tr></table>

随着 ECF 的成熟,这些适配器将会重新定义,而新的适配器也会加进来。


<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

ECF 示例

我们将扮演通信供应者的角色,具体来说,用 Yahoo! 消息协议(YMSG)。我们将采用这个协议的一个开放源码实现 jYMSG。这篇文章包含通过 ECF 在线容器(IPresenceContainer)对 YMSG 的一个基本 ECF 实现。我们将描绘出实现它的步骤,并提供一些可以下载的代码。(请注意这个代码最后很有可能交给 ECF 项目。)以下是实现 YMSG 在线容器的步骤:

  1. 定义并注册一个命名空间 Namespace
  2. 实现一个 ID
  3. 实现容器 Container
  4. 定义并注册一个 ContainerInstantiator
  5. 实现 Yahoo 风格的 IPresenceContainer

命名空间和标识符

命名空间负责通过 ECF 的 IDFactory 创建新的 ID 实例。使用命名空间,能够限制工厂可以创建的 ID 实例的类型。在 YahooNamespace 实现中,为了保持简单,只要求用一个用户名来构建 ID。


清单 1. YahooNamespace.java
<table border="1" cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee"><tr><td>

public class YahooNamespace extends Namespace {
...
public ID createInstance(Class[] argTypes, Object[] args) \
throws IDInstantiationException {
try {
return new YahooID(this, (String) args[0]);
} catch (Exception e) {
throw new IDInstantiationException\
("Yahoo ID creation exception", e);
}
}
}
</td></tr></table>

还需要确保正确地注册了命名空间,这样 ECF 才会知道它。这是通过 org.eclipse.ecf.namespace 扩展点实现的。


清单 2. plugin.xml
<table border="1" cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee"><tr><td>

   
      
   
</td></tr></table>

在创建了命名空间之后,创建标识符 YahooID,用来惟一地标识在 Yahoo! 命名空间中的实体。(请参阅 “下载”。)

容器

在示例 —— 一个面向连接的客户-服务器场景中,ECF 容器代表通信会话。我们将实现 IContainer 接口,并让 YahooContainer 可以适配到 IPresenceContainer 接口。请参阅清单 3 中的重要方法。


清单 3. YahooContainer.java
<table border="1" cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee"><tr><td>

public class YahooContainer implements IContainer {
...
private Session session; // jYMSG session
...
public void connect(ID targetID, IConnectContext connectContext)
throws ContainerConnectException {
String password = getPassword(connectContext);
this.targetID = (YahooID) targetID;
try {
// login to yahoo messaging
session.login(this.targetID.getUsername(), password);
}
...
// listen to yahoo messaging events
session.addSessionListener(new YahooSessionListener(presenceContainer));
// notify ECF we joined
presenceContainer.fireContainerJoined(getConnectedID());
}
...
public Object getAdapter(Class serviceType) {
if (serviceType.equals(IPresenceContainer.class)) {
return presenceContainer;
}
return Platform.getAdapterManager().getAdapter(this, serviceType);
}
...
</td></tr></table>

在上面的代码中,连接到 Yahoo! 消息服务器,并通知 ECF 连接成功。还请注意,在 getAdapter 方法中,适配到 IPresenceContainer 接口。

容器实例化器

容器实例化器是一个简单的类,负责创建 ECF 容器。为了成为容器实例化器,需要实现 IContainerInstantiator 接口。请参阅清单 4 中简单的 YahooConstainerInstatiator。它没有太多内容。


清单 4. YahooContainerInstantiator.java
<table border="1" cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee"><tr><td>

public class YahooContainerInstantiator implements IContainerInstantiator {

public IContainer createInstance(
ContainerDescription description,
Class[] argTypes,
Object[] args) throws ContainerInstantiationException {
ID guid;
try {
guid = IDFactory.getDefault().createGUID();
} catch (IDInstantiationException e) {
throw new ContainerInstantiationException\
("Exception creating ID",e);
}
return new YahooContainer(guid);
}

}
</td></tr></table>

IPresenceContainer

YahooPresenceContainer 是示例中最活跃的类。为了简单,只关注几个方法,请看清单 5。


清单 5. YahooPresenceContainer.java
<table border="1" cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee"><tr><td>

public class YahooPresenceContainer implements IPresenceContainer {
...
public IMessageSender getMessageSender() {
return new IMessageSender() {
public void sendMessage(
ID fromID,
ID toID,
Type type,
String subject,
String messageBody) {
try {
session.sendMessage\
(toID.getName(), messageBody);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
}

public void handleMessageReceived(SessionEvent event) {
for(int i = 0; i < messageListeners.size(); i++) {
IMessageListener l = (IMessageListener) messageListeners.get(i);
ID from = makeIDFromName(event.getFrom());
ID to = makeIDFromName(event.getTo());
l.handleMessage(
from,
to,
IMessageListener.Type.NORMAL,
event.getFrom(),
event.getMessage());
}
}
...
}
</td></tr></table>

请注意,我们实现了 getMessageSender 方法,向用户发送消息。在示例中,使用了 Yahoo Session,并发送适当的消息。而且还有一个 helper 方法,叫作 handleMessageReceived,负责通知在线容器上的 IMessageListener 是否从 Yahoo 用户处接收到了消息。

YahooPresenceContainer 上还有一些必需的方法为了简略而特意留成空。这些方法是:

作为练习,建议通过 getChatRoomManager 方法实现聊天室。

一切都实现之后,为了测试供应者的功能,使用了 ECF 提供的工具(请参阅图 3)运行并选择了我们的供应者。





<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

结束语

ECF 的未来非常光明,因为协同计算在不断增长,像 VoIP 和视频会议这样的特性也快要实现了。而且,还有人说 Eclipse 基金会要采用 ECF,通过 ECF 更好的协同工具支持,提高对项目参与者的支持。

这篇文章简要讨论了 ECF,并提供了一个示例,演示了框架提供的许多功能之一。希望读者日后能自行发现 ECF 的许多用途,并考虑为这个项目做贡献。

致谢

作者向 Scott Lewis 和 ECF 团队表示感谢,感谢他们在编写这篇文章时提供的支持。



<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

下载

<table border="0" cellpadding="0" cellspacing="0" class="data-table-1" width="100%"><tr><th>描述</th><th>名字</th><th style="text-align:right;">大小</th><th>下载方法</th></tr><tr><td class="tb-row">Yahoo ECF Provider</td><td nowrap="nowrap">os-ecl-commfwk_org.eclipse.ecf.provider.yahoo.zip</td><td nowrap="nowrap" style="text-align:right;">142KB</td><td nowrap="nowrap">HTTP</td></tr></table><table border="0" cellpadding="0" cellspacing="0"><tr valign="top"><td colspan="5"></td></tr><tr><td></td><td>关于下载方法的信息</td><td></td><td></td><td>Get Adobe® Reader®</td></tr></table>
<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

参考资料 学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文。

  • 学习关于 Eclipse Communication Framework 的更多内容。

  • 了解关于 Eclipse Foundation 和它的众多项目的更多内容。

  • 访问 developerWorks 的 Eclipse 项目参考资料 学习关于 Eclipse 的更多内容。

  • 保持关注 developerWorks 技术活动和 webcast。

  • 访问 developerWorks 开放源码专区 获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并在 IBM 的产品上利用它们。


获得产品和技术
  • 用 IBM 试用版软件 革新您的下一个开放源码开发项目,这可以下载或从 DVD 上得到。


讨论
  • 通过加入 Eclipse.org ECF 邮件列表 参与开发。

  • 在 Eclipse.org ECF Newsgroup 上寻找帮助。(请注意,点击这个链接会启动您计算机上的 Usenet 新闻组阅读器,如果配置正确的话。)

  • Eclipse newsgroup 上有许多资源,针对有意使用和扩展 Eclipse 的人们。

  • 通过参与 developerWorks blogs 加入 developerWorks 社区。

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>

作者简介<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr valign="top" align="left"><td></td><td></td><td width="100%">

Chris Aniszczyk 是 IBM Lotus 的软件工程师,是 IBM 的 Extreme Blue 实习项目的毕业生。他是衷心的开放源码支持者,并在 Gentoo Linux(http://www.gentoo.org)发行方面工作,是 Eclipse Modeling Framework Technology(EMFT)项目的参与者。

</td></tr></table>
<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr valign="top" align="left"><td></td><td></td><td width="100%">

Borna Safabakhsh 是 IBM Tivoli Security 的软件工程师和 IBM 的 Extreme Blue 实习项目的毕业生。他是用信息技术的力量解决问题的支持者,他寻求的是解决今天和明天问题的新技术和新应用程序。他还是摩托运动和所有速度运动的爱好者。

</td></tr></table>

<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td>
</td></tr></table><table align="right" cellpadding="0" cellspacing="0" class="no-print"><tr align="right"><td>
<table cellspacing="0" cellpadding="0" border="0"><tr><td valign="middle">
</td><td align="right" valign="top"></td></tr></table></td></tr></table>


↑返回目录
前一篇: IBM WebSphere 开发者技术期刊: 为 WebSphere 平台部署 Eclipse 富客户端应用程序
后一篇: PHP 程序员的调试技术