自定义事件类型(Custom Event Types)
自定义事件类型(Custom Event Types)是 SLEE(Service Logic Execution Environment) 中用于在不同的 SBB(Service Building Block)之间进行通信和协作的关键机制。通过使用自定义事件,SBB 开发者可以让不同的 SBB 相互传递信息,实现模块化设计和松耦合的系统架构。
我们可以将自定义事件理解为一个专门设计的消息或通知,某个 SBB 通过这种消息告诉其他 SBB 某些特定事件已经发生。下面我们将从一个具体的场景出发,详细解释自定义事件的原理、实现步骤及代码示例。
1. 场景分析
场景背景:呼叫中心应用中的“帮助请求”和“IVR 完成”事件
假设我们在开发一个 呼叫中心系统,其中包括以下两个子系统:
- 客户服务子系统:客户可以通过拨打电话请求帮助。
- IVR(交互式语音应答)子系统:客户通过自动化的语音系统与系统进行交互,如导航菜单、信息获取等。
在这个场景中,当用户请求帮助或完成 IVR 操作时,我们需要通知系统的其他部分(比如人工客服系统)以便进行相应的操作。为实现这一点,我们定义了两个自定义事件类型:
HelpRequestedEvent
:当用户请求帮助时触发。IVRCompletedEvent
:当 IVR 操作完成时触发。
每个事件将携带一些相关的信息,如用户ID、会话ID等,通知系统的其他部分进行后续处理。
2. 自定义事件类型的组成部分
每个自定义事件类型由以下几部分组成:
- 事件类:定义事件对象的属性和方法,例如携带的数据、触发事件时应做的操作。
- 事件类型定义:通过事件名称、供应商和版本来唯一标识事件类型。
- 事件定义部署描述符:包含事件的元数据,主要用于部署。
- 事件 Jar 文件:用于打包和分发事件类和部署描述符。
3. 示例实现:自定义事件类型的定义和使用
3.1 事件类的定义
首先我们定义两个事件类:HelpRequestedEvent
和 IVRCompletedEvent
,用于表示用户请求帮助和 IVR 操作完成的事件。
事件类1:HelpRequestedEvent
package com.foobar.event;
public class HelpRequestedEvent {
private String userId; // 用户ID
private String requestDetails; // 请求详情
// 构造函数,初始化事件对象
public HelpRequestedEvent(String userId, String requestDetails) {
this.userId = userId;
this.requestDetails = requestDetails;
}
// 获取用户ID
public String getUserId() {
return userId;
}
// 获取请求详情
public String getRequestDetails() {
return requestDetails;
}
}
事件类2:IVRCompletedEvent
package com.foobar.event;
public class IVRCompletedEvent {
private String sessionId; // 会话ID
private boolean success; // 是否成功完成
// 构造函数
public IVRCompletedEvent(String sessionId, boolean success) {
this.sessionId = sessionId;
this.success = success;
}
// 获取会话ID
public String getSessionId() {
return sessionId;
}
// 获取操作是否成功
public boolean isSuccess() {
return success;
}
}
3.2 事件定义部署描述符(event-jar.xml)
事件定义部署描述符是一个 XML 文件,定义事件的元数据,如事件名称、版本、供应商和关联的 Java 类。我们将这些事件定义在 event-jar.xml
文件中。
<event-jar>
<event-definition>
<event-type-name>com.foobar.event.HelpRequestedEvent</event-type-name>
<event-type-vendor>com.foobar</event-type-vendor>
<event-type-version>1.0a</event-type-version>
<event-class-name>com.foobar.event.HelpRequestedEvent</event-class-name>
</event-definition>
<event-definition>
<event-type-name>com.foobar.event.IVRCompletedEvent</event-type-name>
<event-type-vendor>com.foobar</event-type-vendor>
<event-type-version>1.1</event-type-version>
<event-class-name>com.foobar.event.IVRCompletedEvent</event-class-name>
</event-definition>
</event-jar>
在这个文件中,我们定义了两个事件:HelpRequestedEvent
和 IVRCompletedEvent
,并指定了它们的 Java 类。
3.3 事件 Jar 文件
为了分发这些事件类和部署描述符,我们将它们打包成一个 Jar 文件,目录结构如下:
event-jar/
│
├── META-INF/
│ ├── MANIFEST.MF
│ └── event-jar.xml
│
├── com/
│ └── foobar/
│ └── event/
│ ├── HelpRequestedEvent.class
│ └── IVRCompletedEvent.class
META-INF/event-jar.xml
中包含事件定义的描述符,而 com/foobar/event/
中包含事件类的编译文件。
3.4 在 SBB 中使用自定义事件
我们通过 SBB 组件来触发和监听这些事件。一个 SBB 可以通过调用方法来触发自定义事件,另一个 SBB 则可以监听该事件并做出相应的响应。
触发事件的 SBB 示例
假设有一个 HelpRequestSbb
SBB,它负责处理用户的帮助请求,并触发 HelpRequestedEvent
事件。
package com.foobar.sbb;
import com.foobar.event.HelpRequestedEvent;
import javax.slee.ActivityContextInterface;
import javax.slee.Sbb;
import javax.slee.SbbContext;
public abstract class HelpRequestSbb implements Sbb {
private SbbContext sbbContext;
// 当用户请求帮助时触发此方法
public void onUserHelpRequest(String userId, String details, ActivityContextInterface aci) {
// 创建自定义事件对象
HelpRequestedEvent event = new HelpRequestedEvent(userId, details);
// 触发事件,通知其他 SBB
aci.fireEvent(event, null);
}
public void setSbbContext(SbbContext context) {
this.sbbContext = context;
}
public void unsetSbbContext() {
this.sbbContext = null;
}
}
监听事件的 SBB 示例
另一个 SBB ResponseSbb
负责监听 HelpRequestedEvent
事件并处理该事件,例如,启动一个人工服务流程。
package com.foobar.sbb;
import com.foobar.event.HelpRequestedEvent;
import javax.slee.ActivityContextInterface;
import javax.slee.Sbb;
import javax.slee.SbbContext;
public abstract class ResponseSbb implements Sbb {
// 当接收到 HelpRequestedEvent 时执行
public void onHelpRequestedEvent(HelpRequestedEvent event, ActivityContextInterface aci) {
// 响应用户的帮助请求
System.out.println("用户 " + event.getUserId() + " 请求帮助: " + event.getRequestDetails());
// 进一步处理,如通知人工客服
}
public void setSbbContext(SbbContext context) {
// 设置上下文
}
public void unsetSbbContext() {
// 清理上下文
}
}
4. 总结
自定义事件类型在 SLEE 中为 SBB 提供了一种松耦合的交互方式。通过定义自定义事件,SBB 可以通知其他 SBB 某些特定事件已经发生,从而实现模块化和可扩展的系统设计。在上面的示例中,我们展示了如何定义、触发和监听自定义事件,帮助你理解自定义事件的实际应用场景和技术实现。