JAIN-SLEE(Java API for Integrated Networks - Service Logic Execution Environment)是一种架构,用于构建实时电信应用程序,如电话呼叫控制、短信发送、会议电话等。这类应用程序需要能够快速响应来自用户或系统的事件,保证通信系统的高效运作。
为了更容易理解 JAIN-SLEE 的架构,可以将其比作一家工厂:工厂的任务是处理很多订单,每个订单都是一个事件,而工厂中的各种机器负责处理这些订单。JAIN-SLEE 就像一个工厂管理系统,确保不同的机器(或服务)能够高效处理大量的事件。让我们一步一步解释它的各个组成部分。
1. SLEE(Service Logic Execution Environment)是什么?
SLEE 是整个 JAIN-SLEE 架构的核心部分,负责管理和执行电信服务中的逻辑。你可以把 SLEE 看作是一个“操作系统”,它管理所有的服务模块,并确保这些服务能够正确响应外部事件。
2. SBB(Service Building Block)——服务构建块
SBB 是 JAIN-SLEE 中的核心模块之一。每个 SBB 是用来处理特定任务的独立模块,比如处理一个电话呼叫或发送一条短信。可以把 SBB 比作工厂里的某台机器,每台机器都有明确的职责,接收并处理某种特定的订单(事件)。
SBB 的特点:
- 无状态:SBB 不会记住之前处理的事件,每次处理事件都是独立的。如果你需要记录状态,可以用 Activity Context 来存储。
- 事件驱动:SBB 依靠事件触发,比如用户发起电话呼叫就是一个事件,SBB 收到事件后做出响应。
理解: 比如,当你打电话时,这就是一个事件,系统中有一个 SBB 负责接听电话,另一个 SBB 可能负责记录电话的通话时长,所有这些 SBB 组合在一起,构成一个完整的电话服务。
3. 事件(Event)
JAIN-SLEE 架构中,事件就像是信号或通知,它们表示系统中的某些活动或动作。比如“电话来了”是一个事件,“短信发出”也是一个事件。事件驱动了整个系统的运行。
**举例:**当你打电话时,系统接收到一个“呼叫事件”,然后负责处理电话的 SBB 会响应这个事件,并启动后续操作。
4. 活动(Activity)和活动上下文(Activity Context)
- Activity(活动):指的是用户或系统发起的一个持续操作,比如一次电话通话或一场会议。
- Activity Context(活动上下文):可以理解为系统用来记录活动信息的“记事本”。每个活动上下文保存关于某个活动的状态信息,确保系统能够在处理长时间操作(如电话通话)时不丢失状态。
理解: 当你拨打电话时,系统为这个通话创建了一个活动(Activity),记录了通话的状态,比如通话的开始时间、参与者等。SBB 可以通过 Activity Context 来获取和更新这些信息。
5. 资源适配器(Resource Adapter)
资源适配器是 JAIN-SLEE 中用来与外部资源(比如网络、数据库、媒体服务器)进行通信的模块。它们像是“桥梁”,将外部世界的资源引入到 SLEE 环境中。
举例: 资源适配器可以连接到电话交换机,接收真实世界的电话呼叫信息,然后将这些信息作为事件传递给 SBB 进行处理。
6. 服务(Service)
在 JAIN-SLEE 中,多个 SBB 组合在一起可以构建一个完整的服务。比如,一个电话呼叫服务可以由多个 SBB 组成:一个负责建立呼叫,一个负责记录通话时长,另一个负责结束呼叫。所有这些 SBB 协作,形成一个服务。
7. 服务调度(Service Invocation)
服务调度就是当某个事件发生时,系统决定哪个 SBB 来处理这个事件。这个过程就像工厂接到一个新订单时,工厂的管理系统决定把这个订单交给哪台机器来处理。
8. 事件路由(Event Routing)
事件路由是 JAIN-SLEE 系统内部的机制,它将接收到的事件分发到合适的 SBB。就像工厂里的物流系统,确保每个订单被送到正确的机器。
JAIN-SLEE 架构是如何运作的?
整个 JAIN-SLEE 系统可以简单描述为一个事件驱动的实时处理系统,它接收来自外部的事件,然后根据事件类型调用对应的 SBB 进行处理。
- 事件产生:某个事件(例如电话呼叫、短信发送)被触发。这个事件被 SLEE 监控到。
- 事件路由:SLEE 将这个事件路由到合适的 SBB,SBB 会处理该事件。
- SBB 响应事件:SBB 执行相应的业务逻辑,处理事件,比如应答电话、发送短信等。
- 处理结果:处理完成后,SBB 可以生成新的事件或者修改系统的状态,结束整个处理流程。
要理解 JAIN-SLEE 如何运作,最好的方法是通过一个具体的示例来演示每个组件如何协调交互。我们以一个典型的“电话呼叫处理”场景为例,逐步讲解每个部分是如何运作的。
系统场景:电话呼叫处理
假设我们有一个电话呼叫服务,当用户拨打电话时,系统需要:
- 接收电话呼叫事件
- 处理呼叫事件并连接双方
- 在通话结束后记录通话信息
这个过程涉及多个组件的协调,下面我们会分步骤讲解每个组件的职责,以及它们如何互相交互。
1. 事件的产生:电话呼叫事件
当用户拨打电话时,电话交换机会产生一个“呼叫事件”(Call Event)。此时,系统需要接收这个事件。通常情况下,事件是由资源适配器(Resource Adapter)从外部资源(例如电话网络)接收到的。
- 资源适配器相当于负责接入电话网络的桥梁,它会把电话系统中的信号(呼叫、挂断等)转换为 JAIN-SLEE 系统可以理解的事件。
举例:
public class CallEvent {
private String callerNumber;
private String calleeNumber;
public CallEvent(String caller, String callee) {
this.callerNumber = caller;
this.calleeNumber = callee;
}
public String getCallerNumber() { return callerNumber; }
public String getCalleeNumber() { return calleeNumber; }
}
这里 CallEvent
代表一个电话呼叫事件,包含了呼叫者和被呼叫者的信息。
2. SLEE 负责事件管理和调度
事件产生后,SLEE 会将这个事件分发给负责处理电话呼叫的组件,这个组件就是SBB(Service Building Block)。
- SLEE 就像系统的“大脑”,它负责管理事件的路由和调度。每当资源适配器传来一个事件,SLEE 会根据配置,找到合适的 SBB 来处理事件。
举例:
public class CallSbb implements Sbb {
// 处理电话呼叫事件的回调方法
public void onCallEvent(CallEvent event, ActivityContextInterface aci) {
System.out.println("接收到呼叫事件,呼叫者:" + event.getCallerNumber() + ",被呼叫者:" + event.getCalleeNumber());
// 这里可以添加处理逻辑,比如尝试接通电话
}
}
这个 SBB 的 onCallEvent
方法会响应电话呼叫事件,打印出呼叫者和被呼叫者的号码。
3. SBB 处理电话呼叫
SBB 接收到事件后,会根据事件类型,执行相应的逻辑。例如,当 SBB 收到“呼叫事件”时,系统会尝试接通电话。这个过程可能会涉及多个 SBB 的协调:
- 接听呼叫 SBB:负责接听电话并建立通话。
- 记录通话 SBB:负责记录通话信息,例如通话时长、开始和结束时间。
接听呼叫 SBB:
public class AnswerCallSbb implements Sbb {
public void onCallEvent(CallEvent event, ActivityContextInterface aci) {
System.out.println("尝试接通电话,呼叫者:" + event.getCallerNumber());
// 模拟接通电话
connectCall(event.getCallerNumber(), event.getCalleeNumber());
}
private void connectCall(String caller, String callee) {
System.out.println("电话已接通,呼叫者:" + caller + ",被呼叫者:" + callee);
}
}
记录通话 SBB:
public class RecordCallSbb implements Sbb {
public void onCallEndEvent(CallEndEvent event, ActivityContextInterface aci) {
System.out.println("记录通话,通话时长:" + event.getCallDuration() + "秒");
// 将通话信息存入数据库
saveCallRecord(event.getCallerNumber(), event.getCallDuration());
}
private void saveCallRecord(String caller, int duration) {
System.out.println("通话记录已保存,呼叫者:" + caller + ",通话时长:" + duration + "秒");
}
}
4. 事件结束与系统交互
当通话结束时,电话系统会产生一个“呼叫结束事件”(Call End Event)。这个事件同样会通过资源适配器传递给 SLEE,SLEE 再把事件路由给负责处理结束事件的 SBB。
在这里,RecordCallSbb
就是处理呼叫结束事件的组件,它会记录通话的时长等信息。
举例:
public class CallEndEvent {
private String callerNumber;
private int callDuration;
public CallEndEvent(String caller, int duration) {
this.callerNumber = caller;
this.callDuration = duration;
}
public String getCallerNumber() { return callerNumber; }
public int getCallDuration() { return callDuration; }
}
通话结束后,CallEndEvent
事件会触发,SBB 通过获取通话时长来完成数据保存。
5. 系统内的协调与管理
在整个流程中,SLEE 负责管理和调度所有的 SBB 和事件。SLEE 会根据系统配置的规则,将不同的事件分发到对应的 SBB 去处理。
例如,当用户拨打电话时,SLEE 会将呼叫事件传递给 AnswerCallSbb
来接听电话;当通话结束时,SLEE 会将通话结束事件传递给 RecordCallSbb
来记录通话信息。
- 事件驱动架构:SLEE 系统基于事件来驱动业务逻辑。任何操作的触发都源于事件(如呼叫事件、结束事件等),然后 SLEE 决定哪个 SBB 来处理。
JAIN-SLEE 系统的运作流程总结
- 事件产生:外部系统产生事件(例如电话呼叫)。
- 事件路由:资源适配器将事件发送给 SLEE,SLEE 决定路由哪个 SBB 处理事件。
- SBB 响应事件:SBB 收到事件后,执行相应的业务逻辑,例如接听电话、记录通话等。
- 系统持续处理:在整个电话通话过程中,多个 SBB 可能协作工作,处理不同的任务。
- 事件结束:当事件(如电话通话)结束时,SLEE 将新事件分发给另一个 SBB 来处理结束流程。