当前页面: 开发资料首页 → Eclipse 专题 → Eclipse Communication Framework 入门
摘要: Eclipse Communication Framework(ECF)是一个新的 Eclipse 项目,目的是提供一个开放源码框架,支持在 Eclipse 平台上创建基于通信的应用程序。本文将研究 ECF、它的基本功能和它未来的方向。
背景
最简单地说,ECF 项目的目的就是提供一个跨协议的 API。ECF 将为四类支持者创造价值:
ECF 为了满足这个目标提供了一套高级抽象,而不是另一套消息 API。这一设计选择使得可以在不同的应用程序上下文环境和用户界面中重用高级通信组件(即时消息、文件共享、视频会议等)。假设要开发一个应用程序,需要即时通信、博客、BT 下载、文件共享和语音会议。那么使用 ECF 开发可以跨越每个服务的通信代码,从而让开发人员可以专注于业务逻辑和用户界面。
安装 ECF
ECF 是作为一套 Eclipse 插件安装的,通过标准的插件安装过程进行:
ECF 项目还有一个包含额外的供应者和应用程序示例(IRC、JMS 等)的服务器:
ECF 甜头
我们相信,一点儿甜头对于任何文章的成功都至关重要(必须保持读者的兴趣)。图 1 显示的示例 ECF IRC 供应者演示了这个框架的一些聊天室功能。图 2 显示了两个消息连接的示例好友列表视图。
现在已经看到了 ECF 的样子,可以进一步讨论细节了。
ECF 适配器
理解 ECF 工作方式的第一步是快速地查看它的 API,特别是适配器。在 ECF 中,基本的构建块是 IContainer 实例的通信容器。IContainer 实例提供了 ECF 中通信的公共接口。它可以代表某个通信上下文的实例,可以是客户-服务器型的通信模型,也可以是出版-订阅型的通信模型。
IContainer 是 ECF 中的一个重要接口,它通过熟悉的 Eclipse IAdaptable 接口提供的可扩展性也至关重要。因为 ECF 容器是 IAdaptable 的,支持运行时可扩展性,所以可以查询运行时实例的功能,并对实例进行操作。ECF 上下文的功能示例包括在线/聊天、聊天室等。下表列出了 ECF 中的公共功能。
随着 ECF 的成熟,这些适配器将会重新定义,而新的适配器也会加进来。
ECF 示例
我们将扮演通信供应者的角色,具体来说,用 Yahoo! 消息协议(YMSG)。我们将采用这个协议的一个开放源码实现 jYMSG。这篇文章包含通过 ECF 在线容器(IPresenceContainer
)对 YMSG 的一个基本 ECF 实现。我们将描绘出实现它的步骤,并提供一些可以下载的代码。(请注意这个代码最后很有可能交给 ECF 项目。)以下是实现 YMSG 在线容器的步骤:
Namespace
ID
Container
ContainerInstantiator
IPresenceContainer
命名空间和标识符
命名空间负责通过 ECF 的 IDFactory
创建新的 ID
实例。使用命名空间,能够限制工厂可以创建的 ID 实例的类型。在 YahooNamespace
实现中,为了保持简单,只要求用一个用户名来构建 ID。
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 扩展点实现的。
</td></tr></table>在创建了命名空间之后,创建标识符 YahooID
,用来惟一地标识在 Yahoo! 命名空间中的实体。(请参阅 “下载”。)
容器
在示例 —— 一个面向连接的客户-服务器场景中,ECF 容器代表通信会话。我们将实现 IContainer
接口,并让 YahooContainer
可以适配到 IPresenceContainer
接口。请参阅清单 3 中的重要方法。
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
。它没有太多内容。
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。
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
上还有一些必需的方法为了简略而特意留成空。这些方法是:
getAccountManager
—— 负责与帐户维护有关的操作(修改口令、创建帐户等)getPresenceSender
—— 负责把在线状态的更新(离开/可用、添加好友等等)通知相关人员getChatRoomManager
—— 负责管理聊天室(例如 Yahoo 聊天大厅) 作为练习,建议通过 getChatRoomManager
方法实现聊天室。
一切都实现之后,为了测试供应者的功能,使用了 ECF 提供的工具(请参阅图 3)运行并选择了我们的供应者。
结束语
ECF 的未来非常光明,因为协同计算在不断增长,像 VoIP 和视频会议这样的特性也快要实现了。而且,还有人说 Eclipse 基金会要采用 ECF,通过 ECF 更好的协同工具支持,提高对项目参与者的支持。
这篇文章简要讨论了 ECF,并提供了一个示例,演示了框架提供的许多功能之一。希望读者日后能自行发现 ECF 的许多用途,并考虑为这个项目做贡献。
致谢
作者向 Scott Lewis 和 ECF 团队表示感谢,感谢他们在编写这篇文章时提供的支持。
下载
<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 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>Borna Safabakhsh 是 IBM Tivoli Security 的软件工程师和 IBM 的 Extreme Blue 实习项目的毕业生。他是用信息技术的力量解决问题的支持者,他寻求的是解决今天和明天问题的新技术和新应用程序。他还是摩托运动和所有速度运动的爱好者。
</td></tr></table>
↑返回目录
前一篇: IBM WebSphere 开发者技术期刊: 为 WebSphere 平台部署 Eclipse 富客户端应用程序
后一篇: PHP 程序员的调试技术