级别: 初级 John W Rooney, Eben Stewart,
2003 年 6 月 01 日
在LDD Today 文章
《创建自己的Sametime bots,第一部分》中,我们关注如何使用自动化代理(称为bot)来响应用户的查询。在这篇文章中,我们将把这一理念提升到一个新的高度,向您显示如何将应用程序连接到Sametime,以及使用即时消息处理(IM)作为警告系统-甚至把它整合到您的工作流程中。我们将阐述的关键点是应用程序如何开始与用户交谈,而不是其它方式。
我们将首先讨论重要的Sametime概念, 以及您如何将这些理念结合到自动化警告和工作流程程序。然后我们将详细测试AlertBot-一个正在发挥作用的Sametime bot, 显示向用户积极发送消息需要的基本技巧。(您可以从
http://www.lotus.com/ldd/Sandbox.nsf下载获得AlertBot的程序代码。)
本文假设您是一位富有经验的Sametime和Java编程人员,熟悉Sametime的开发人员工具包。
简单回顾IM概念
几年前,当我们首次在IBM内部推广Sametime 即时消息处理(IM)时,开始时我们遇到了正常的阻力,用户喜欢使用新技术作为通信的关键工具。公司内部的电子邮件传送体系经过高度优化,经常用于与全球同事进行"近实时"的对话。考虑到这一点,用户经常询问IM与电子邮件有什么区别,使用IM可以获得什么优势。
今天我们全都对IM将如何显著改变用户的交互了如指掌。IM和电子邮件之间最明显的差异是在线和感知。当在企业中讨论IM时我们经常整合这两个理念,但从本文考虑,我们将分别考虑这两个理念。
开始时我们将考虑在线和感知如何与bots关联。当我们与用户谈论bots时,我们经常突出大量重要的事实。例如,它方便用户了解bots如何提供便利来在Sametime Connect客户机内工作。但便利只是bots的第一部分。使用Sametime中的在线和感知功能,我们可以将IM深度集成到我们的应用程序中。事实上,您不仅仅可以知道bot在线,而且bot可以"知道"您的在线时间以及您当前的在线状态。您的应用程序可以跟踪用户状态发生的变化(如从"离席"转为"入座"),使用它作为触发器来运行发送消息等操作。因此,让我们深入讨论在线和感知,了解您如何将这些特性结合到运行警告和通知服务的Sametime bot中。
在线
在线 是您向网络中的其它人展示您的当前行为状态的能力。在Sametime中这些状态为:
- 在线- 可用
- 在线- 离开
- 在线- 请勿打扰
- 离线
这是一种非常强大的功能,因为它使您能够了解特定的用户是否在线并能够响应消息。使用电子邮件和其它类型的消息处理,您通常可以发送通知,但不会知道接收人是否在阅读这类消息。您可能会获得迅速的反应,但也可能不会-这就是电子邮件和IM之间的关键区别。
许多用户认为电子邮件的内容更丰富,因为不像IM,您可以附带文件、嵌入图片等。这是对的(至少目前来说,考虑到IM技术的当前状态),但这不是我们的所说的意思,我们并不准备尝试IM作为电子邮件的完全替换品。实际上,IM扩展了电子邮件和其它消息处理系统-当然,IM和电子邮件可以集傻降ジ鲇τ贸绦蛑校鏝otesBuddy。 但在时间变得日益珍贵的世界中,需要了解指定的人此时是否在线成为业务应用程序的关键部分。
感知
感知是判断IM环境中其它人是否在线的能力。与在线一样,这归结为使交谈的发起人知道获得即时回应的可能性。感知还允许发起人决定交谈时要使用的媒体。例如,比如说您正在与一位同事做一次演讲,您需要确定本季度最新的销售预测。您期望这是一次简单谈话,因此您打开Sametime Connect ,向同事发送即时消息。但是,当您看她的名字时,您发现她的状态显示为请勿打扰-因此您不能开始与她交谈。 此外,她留下了一条消息,声明她正在全天处理客户事件。在掌握这两条消息之后,您现在可以决定:如果您可以在明天之前不需要预测结果,那么您向她发送一份邮件。如果您今天需要这类消息,您可以查找另一位同事来获得它。这是一个简单的例子,但它说明了如何了解将影响您的商务流程的另一位用户的IM状态。这种功能非常强大,我们将向您介绍一些应用程序如何利用感知的例子。
在这我们需要重点说明的最后一件事是不同消息类型对接收人的"心理"影响,以及我们如何对我们的响应分配优先级。我们全都认识到电子邮件带来的超负荷。每天我们的收件箱中被大量的消息所淹没。大多数电子邮件程序都提供了工具来帮助处理这类信息泛滥(例如Notes文件夹和规则)。但有时它仍旧很难做到这一点。您是否对我们经常听到用户抱怨他们"生活在它们的电子邮件中"感到惊讶?另一方面,IM 表现了"简单会话"即时、简便的优势。另外,在我们在IBM中部署Sametime的经验中,我们发现了大量的例子,IM使用户无需执行多任务和同时继续进行多次交谈。想像一下-如果您处在重要任务的中间阶段, 您喜欢那种方式来响应:即时消息还是电子邮件?大多数用户首先选择的是即时消息,即使谈话的主题显得不太重要也是如此。消息在您的屏幕上显示,您进行对话、解决问题,然后继续下一步。此外,用户很容易邀请其它人加入到对话中、扩大讨论并缩短您对查询的响应时间。
将IM集成到应用程序中
现在我们讨论您可以在应用程序中充分利用在线和感知功能,甚至将IM集成到您的商务流程中,尤其是用户警告和工作流。
警告
首先,我们讨论使用Sametime来向用户提供服务器生成的警告。我们都有需要向用户通告某些事件的应用程序,例如状态的变化或预计流程的例外情况。一个很明显的例子是当服务器故障时或当它到达性能阈值时向管理员发送的警告。(当然,IBM的自动计算战略在未来将使这类战略变得普遍和重要)这类警告可以自动传递给蜂窝电话、寻呼机或电子邮件。
我们还可以通过IM来提供这些警告。我们可以向应用程序添加程序代码,这些应用程序捕获消息、连接Sametime来查看规定接收人的状态以及确定消息是否可以通过Sametime传送到该位用户。如果用户在线并可用,您的应用程序可以向它发送即时消息。如果用户处于其它状态,您的应用程序可以选择下一种最佳方式(如电子邮件或中文寻呼机)来联系该位用户。
在Sametime的早期版本中,您发送的消息在用户的桌面上打开一个聊天窗口。使用Sametime 3,我们现在提供了另一种消息类型-通知-它在用户桌面上打开一个对话框,但用户不能回答。如果您不希望用户继续与生成警告的应用程序交谈时,这种消息类型非常有用。
工作流
我们至少了解了一些应用程序中工作流的概念。其中大多数人通过使用电子邮件表单路由参与工作流管理系统。由于近来重点关注应用程序转移到Web,我们的工作流系统经常使用电子邮件来路由表单摘要并附带一个用户可以点击来采取适当措施的URL。通常,这些应用程序工作良好,但当我们需要把这类消息正确提交给用户时,IM可以提供更好的备选方案。
现在我们讨论如何将IM结合到工作流中的决策树状结构。
当我们讨论使用IM来推动工作流程时,在老式"经验证证明是好的"电子邮件系统似乎足以应付的前提下,有些人对Sametime中实践审批表单的价值提出了质疑。此处的关键是找到适用于您应用程序的平衡点。记住,您无需使用IM来传送所有表单消息。如果您的应用程序通过桌面应用程序来提交表单,根据前面所述,您可以简单地使用Sametime来发送警告。如果您的应用程序为表单提供了Web界面,您可以向审批人发送一个URL来点击打开该表单。
当然,我们鼓励您考虑允许审批人通过Sametime界面显示审批的方式。Sametime传递的消息目前只限于文本,但通常不影响您传送相关消息的能力。同样需要记住的是Sametime会话可以进行鉴权和加密。您可以相信消息将被正确的用户收到,并且消息内容是安全的。
AlertBot
我们的样例AlertBot(您可以从http://www.lotus.com/ldd/sandbox.nsf 下载)展示bot使用在线和感知功能来积极向用户发送消息需要的基本技术。这可以使任何bot扩展超出简单的查询/响应系统的范畴,进入到全特性的应用程序中。在这一例子中,AlertBot观察某个人的在线状态,当他/她的状态改变后发送警告。
AlertBot 展示以下方面:
- 把用户标识(用户ID)解析到Sametime用户对象
- 观察Sametime用户的在线状态
- 开始与Sametime用户交谈会话
在讨论AlertBot过程中,我们略过了基本方面,如登录、使用listener和发送和接收文本。这些在
前一篇文章 中介绍,如果您希望了解这些主题,您可以参阅这一篇文章。现在我们讨论某些专用于确定用户和维护感知功能的新对象。在以下两行程序代码中,LookupService提供Resolver对象。Resolver对象读取用户ID为一个字符串并把它"解析"为一个可以用于启动会话的实际用户对象:
protected LookupService lookupService;
protected Resolver resolver;
|
AwarenessService提供WatchList对象。WatchList 维持观察的用户列表并提供感知消息(通过AwarenessListener界面):
protected AwarenessService AwarenessService;
protected WatchList watchList;
|
如欲使用这些对象,您必须首先创建并启动它们。这通常在loggedIn( )事件中完成(在LoginListener 接口中)。首先创建LookupService对象,然后从LookupService创建Resolver对象并向其添加listener 。(方法参数的详细阐述请参阅Sametime Java Toolkit Developer's guide。)
//Get a handle to the Lookup Service and add a resolve listener
lookupService = (LookupService) stsession.getCompApi(LookupService.COMP_NAME);
resolver = lookupService.createResolver(true, false, true, false);
resolver.addResolveListener(this);
|
接下来创建AwarenessService 。然后创建WatchList对象并向其添加listener:
//Get a handle to the Awareness Service and create a WatchList
AwarenessService = (AwarenessService) stsession.getCompApi(AwarenessService.COMP_NAME);
watchList = AwarenessService.createWatchList();
watchList.addStatusListener(this);
|
在我们的例子中,用户在程序中制定并立即进行解析。在许多高级应用程序中,用户名称列表可以由应用程序自己管理。解析可以随时进行,而不仅仅是在登录时。现在,我们调用Resolver来解析我们的一位用户:
resolver.resolve(UTW); // UTW is the String user ID Constant
|
同样,当调用loggedOut( )事件时确保删除这些listeners,并清除Resolver和WatchList对象:
resolver.removeResolveListener(this);
watchList.close();
watchList.removeStatusListener(this);
|
ResolveListener接口包括三种方法。我们在AlertBot 中唯一使用的是resolved( )。在这一方法中,字符串用户ID被解析成一个可以使用的对象STUser。STUser对象为Sametime用于代表一位有效登录的用户的主要对象。这一STUser对象被WatchList用于开始监视这一STUser对象的状态。在这所有需要做的是将STUser对象添加到WatchList:
public void resolved(ResolveEvent re) {
if (re.getResolved() instance of STUser) {
STUser user = ((STUser) re.getResolved());
String userName = user.getName();
sysOut("Resolved " + userName);
watchList.addItem(user);
sysOut("Added " + userName + " to WatchList");
}
}
|
AwarenessListener有两种事件方法,我们只关注其中一种userStatusChanged( )。无论何时被观察的用户的状态发生变化后都调用这一方法,包括用户第一次添加到WatchList。我们还验证用户的当前状态(如果用户激活或离开只发送警告)。IM对象通过ImService,使用createIm( )方法来创建。⒁猓旱贝唇↖M对象时,在打开IM之前必须添加ImListener ,以确保我们收到ImOpened( )事件:
public void userStatusChanged(StatusEvent se) {
//We get an array of objects representing the users
Object wu[] = se.getWatchedUsers();
STWatchedUser stwu = (STWatchedUser) wu[0];
sysOut(stwu.getName() + " status changed to " + stwu.getStatus().getStatusDescription());
if (stwu.getStatus().getStatusType() == STUserStatus.ST_USER_STATUS_ACTIVE ||
stwu.getStatus().getStatusType() == STUserStatus.ST_USER_STATUS_AWAY) {
//Send an alert to the user
sysOut("Alert called for " + stwu.getName());
//Set the IM Type to IM_TYPE_CHAT
int imt = ImTypes.IM_TYPE_CHAT;
//Set the encryption level
EncLevel enc = EncLevel.ENC_LEVEL_ALL;
//Create the channel to the user
Im im = imService.createIm(stwu, enc, imt);
Im.addImListener(this);
im.open();
}
}
|
ImOpened( )事件与我们前一篇文章中介绍的ImReceived( )事件非常类似,但当本地打开IM对象时生成 ImOpened() ,当远程打开IM对象时生成ImReceived( )事件。在ImOpened( )事件中,我们有一个众所周知的有效的STUser对象和打开的IM对象。现在我们可以使用IM对象来发送文本消息,我们告诉用户他/她的当前状态,状态消息是:
public void ImOpened(ImEvent ie) {
sysOut("IM Opened to " + ie.getIm().getPartner().getName());
//To get the user status, we need to cast the IM object as an STWatchedUser
STWatchedUser stwu = (STWatchedUser) ie.getIm().getPartner();
if (ie.getIm().isOpen()) {
String text = "I see that your status has changed to " + (stwu.getStatus().getStatusType() ==
STUserStatus.ST_USER_STATUS_ACTIVE ? "Active" : "Away");
ie.getIm().sendText(false, text + " with the message \"" + stwu.getStatus().getStatusDescription() +
"\"");
sysOut("Message sent to " + ie.getIm().getPartner().getName());
try {
// This is to make sure the message is sent before closing the IM
Thread.sleep(2000);
} catch (InterruptedException e) {
}
ie.getIm().close(STError.ST_OK);
}
}
|
结语
Lotus Sametime的在线和感知功能可以将简单的查询/响应bots提升为强大的应用程序。通过表示在线和利用感知功能,您的应用程序可以与用户开始会话并响应用户要求。在您的应用程序中使用这些特性可以从Sametime环境创造更多的价值,缩短您关键问题的响应时间。请自由测试和使用我们的AlertBot程序代码。我们希望能够在您的企业中充分利用这些先进理念。
参考资料
作者简介  | |  | John W. Rooney是IBM互联网技术开发部经理。Rooney (朋友们这样称呼他)和其Webahead小组开发了在IBM内部广泛使用的大量应用程序,包括多个严重依赖Sametime bot技术的应用程序。 |
 | |  | Eben Stewart是IBM Webahead/互联网技术部门的软件工程师。他是BotServer的主要开发人员,BotServer是IBM用于提供Bluepages (企业目录bot)等bot应用程序以便互联网使用的工具包。 |
对本文的评价
|