dev2dev 首页 > 资源中心 > 技术文章
构建您的第一个WebLogic Event Server应用程序
摘要
WebLogic Event Server是下一代的事件驱动型SOA实时Java容器。它在节点事件处理网络的使用中结合了OSGi服务包和 Spring框架——这是一种强有力的组合。 本文的目的是引导大家按部就班地创建第一个WebLogic Event Server应用程序。您可以快速地创建和发布(部署)一个WebLogic Event Server应用程序。完成本教程后,您将能够对实时事件驱动架构的设计原理有很好的理解。
一般概念
在开始开发之前,我们先来了解一些基本的概念。本文所开发的应用程序将对一个复杂的事件处理(CEP)网络建模,如图1所示。其中的节点(阶段)包括事件的合作生产者(producer)和消费者集合,分别表示以下内容:
- 服务——可以是适配器、数据流和处理器的联合。
- 业务对象——它们是简单的Java对象(POJO),可以使用受支持的Spring框架(Spring Bean)并且是维持业务逻辑(将根据相关事件运行)的“工具”。
- 事件——它们“横跨”事件网络并可以表示为POJO或映射。
 图1.事件驱动的编程模型
主流的Spring框架
这种新型的Java容器完全支持Spring。这种主流的全栈Java应用程序框架为项目开发提供了显著的优越性,增加了开发的工作效率和运行时性能,同时改进了测试覆盖和应用程序质量。 WebLogic Event Server支持的事件驱动编程范例提供了基于Spring的说明性汇编和配置,如图2所示。这样可以在Spring配置文件中对应用程序进行配置。这些文件并入了一些常用的Spring标记,这些标记可用于WebLogic Event Server服务、与老版Spring bean的无缝集成,以及一些额外服务(比如BEA产品任务夹中的SOA fabric所提供的服务)的依赖性注入功能。 图2.HelloWorld Spring汇编文件示例
事件处理语言
关于复杂事件处理(CEP)还有一个重要的方面值得注意,处理器使用BEA Event Processing Language (EPL)从一个或多个传入数据流中获取“事件”。EPL在事件处理器上下文中的使用类似于结构化数据的数据库管理——不过是方向相反罢了。使用SQL查询随机查询数据时信息将始终保持静态的,而在事件驱动的应用程序中却有所不同:查询是静态的,而数据是不断变化的。处理器(即CEP引擎)通过EPL不断地筛选、关联和管理因果关系,然后聚集数据流,所有这些都是在软实时中执行。 EPL是一种类似于SQL的事件处理语言,用于驱动处理器。它通过使用WHEN(而不是IF)子句扩展了传统的SQL功能,因此可用于处理所需的时间限制(temporal constraint)从而在流动的数据中定义窗口,在这些窗口中可以识别事件模式并执行相应的操作。此处是EPL的一个示例:
<n1:config>
<processor>
<name>helloworldProcessor</name>
<rules>
<rule id="helloworldRule"><![CDATA[
select * from HelloWorldEvent retain 1 event ]]></rule>
</rules>
</processor>
<adapter>
<name>helloworldAdapter</name>
<message>HelloWorld - the current time is:</message>
</adapter>
</n1:config>
清单1. HelloWorld示例中所使用的EPL 在清单1中,示例EPL语句中的“retains”子句定义了对于查询可见的事件窗口。在本例中,retain的值为1表示各窗口只显示一次。处理这些事件的代码如清单2所示。 EPL是一种功能强大的语言,开发人员使用它可以执行全面的查询操作,从而能够从传入数据中“析取”各种事件并调用业务逻辑(POJO)。EPL定义在应用程序的编辑方面之外,从而可以提高开发人员的工作效率和灵活性,这一点是相当值得称赞的。实际上,在动态地修改查询时,我们并不需要重编译、绑定和重新发布相关的应用程序就可以使解决方案能够实时地根据变化的条件和环境做出反应。 编程的概念已经了解得差不多了。接下来,我们再大致了解一下容器,然后再编写一些实际的代码。
事件驱动型SOA的实时Java容器
此时,您可能会有所疑问:BEA并未对其主流的Java EE应用服务器提供任何传统的扩展,也未对其他产品提供任何增件。WebLogic Event Server是一个全新的产品,它是基于最新的BEA微服务架构(micro-services architecture,msA)重新开发的Java容器。其核心架构能在预先确定峰值作业量的情况下提供确定性的、极低的应用程序延时——这是高性能实时应用程序的必要条件。这与其他解决方案不同,开发人员不再需要编写新的扩展API或复杂的自我内存管理(self-memory management)实现。新的Java容器在开发人员实时概念中采用了透明性(transparently)这一原则以实现其目标,比如动态地最小化线程上下文切换和同步,调节I/O(如套接字连接),以及合并实时调度技巧和高效内存管理。 所有这功能都可以通过事件SOA (EDSOA)家族的另一个产品进行增强,那就是WebLogic Real Time。有关这一产品的详细内容可以参阅其他文章。WebLogic Real Time为WebLogic Event Server提供了一个独特的、基础的运行时,这需要使用其专注于低延时的Java虚拟机(JVM),如图3所示。  图3. 独特的的确定性Java运行时和Java容器
新的RAD开发环境
至此,大家已经了解了一些新概念和新实现,下面我将介绍一下WebLogic Event Server的BEA Eclipse快速开发环境(RAD)。 了解这些新技术所提供的概念和丰富特性固然重要,不过BEA现在还为动态创建和发布WebLogic Event Server应用程序提供了一组直观的向导。 在构建第一个EDA应用程序(传统的“HelloWorld”)之前,我们需要确保已经安装好所有必须的软件。我推荐使用带有 WTP 的Eclipse 3.2,然后使用“特性更新”功能获得最版本的 Spring。接下来,安装BEA WebLogic Server Plug-in(如图4所示)的自定义BEA Eclipse Technology Preview,这需要再次使用“特性更新”功能中的Local Site选项。  图4. 安装WebLogic Event Server Eclipse plug-in
HelloWorld应用程序
图5显示了构成HelloWorld事件处理网络(应用程序)的各个组件。  图5. HelloWorld事件处理网络 这个应用程序由以下这些组件组成:
- HelloWorldAdapter——这个组件每隔一秒生成一个Hello World消息。在实际场景中,该组件通常用于从某个来源读取数据流,比如从商业机构读取数据提要,并将其转换成复杂事件处理器能够理解的事件流。HelloWorld应用程序中还包括一个HelloWorldAdapterFactory用于创建HelloWorldAdapter的实例。
- HelloWorldInstream——这个组件用于将适配器生成的事件(在本例中为Hello World 消息)传递给复杂事件处理器。
- HelloWorldProcessor——这个组件将来自HelloworldAdapter组件的消息转发给包含逻辑的POJO。在现实场景中,该组件通常用于执行数据流中的额外的和可能更复杂的一些事件处理,比如说根据属性值或事件分组选择事件的一组子集(参见上面的代码清单)。
- HelloWorldOutstream——这个组件用于将复杂事件处理器所处理的事件传递给包含有用户定义业务逻辑的POJO。
- HelloWorldBean——这是一个POJO组件,每次通过输出流从处理器接收到一批消息时它都将消息打印出来。在现实场景中,该组件将包含应用程序的业务逻辑,比如说运行报告(关于来自处理器的事件集合),或者发送合适的电子邮件或报警消息。
此处是HelloWorldBean的代码:
public class HelloWorldBean implements EventSink {
public void onEvent(List newEvents) throws RejectEventException {
for (Object event: newEvents) {
HelloWorldEvent helloWorldEvent = (HelloWorldEvent) event;
System.out.println("Message Robin: " + helloWorldEvent.getMessage());
}
}
}
清单2. HelloWorldBean类 如清单2所示,任何事件处理程序都只需要实现EventSink接口。然后再调用onEvent()方法。注意,它的参数为List类型的事件。这是因为EPL语句可以生成多个相关的事件对象。但是,在本例中的HelloWorld程序中,我们只接收列表中的一个事件。 用于生成事件的HelloWorldAdapter相当简单。它每隔300毫秒调用一次生成事件的方法:
public class HelloWorldAdapter extends ActiveAdapter {
/* ... */
private void generateHelloMessage() {
List eventCollection = new ArrayList();
String message = this.message + dateFormat.format(new Date());
HelloWorldEvent event = new HelloWorldEvent();
event.setMessage(message);
eventCollection.add(event);
fireEvent(eventCollection, null);
}
}
清单3. HelloWorldAdapter类的选段 如您所见,要发送消息只需创建了一个ActiveAdapter子类,然后创建一个Event实例并填充它,再调用fireEvent()即可。
创建项目
成功安装好软件之后,请在Eclipse中打开File->New -> Project,并选择Server Application Project,如图6所示。  图6. 创建一个WebLogic Event Server项目 现在,向导的其余过程已经相当直观了,不过有关其详细内容可以参阅BEA软件中所提供的EventServerToolingPreview.Getting.Started.Guide.pdf文档。 遵循向导的步骤,输入新应用程序名称和Target WebLogic Event Server运行时,最重要的是别忘了选中“include the HelloWorld source code”选项框。只需要几秒钟,便可以动态地创建一个新项目,使其工件可以部署(发布)一个完整功能的解决方案。
开始开发
在研究新兴的复杂事件处理网络之前,我先介绍一些使用Eclipse IDE Event Server Plug-in时所产生的工件,并为大家提出一些建议,如图7所示。  图7. 使用Eclipse IDE进行快速应用程序开发 在“src”部分可以找到Event Server项目的Java代码。如果没有看到任何HelloWorld源代码,那么您一定没有在向导中选中将“helloworld”模板加入项目的选项。要实现您自己的代码,可以从helloworldBean.java开始,或许还可以修改与事件相关的输出消息。 在META-INF部分中(Spring下面),可以找到Application Spring Assembly文件,该文件将解决方案中包含的所有节点联结在一起。该文件可以使用强大的代码完成IDE功能在复杂的事件处理网络中创建新节点。 最后,在META-INF部分下(wlevs下面),我们还可以找到EPL定义,我们可以在该文件中指定语句和相关的子句的作用,用于到达应用程序的数据(通过一个或多个适配器)。
结束语
构造应用程序是具有挑战的过程(尤其是在研究WebLogic Event Server的更多功能时),这是因为EDA要求导航OSGi服务包、Spring Assembly文件、EPN和一些其他的混合组件。然而,使用本文中的第一个插件,并结合其即将公布的一组新IDE特性,开发人员可以简化动态创建和部署(发布)新WebLogic Event Server应用程序的过程。 BEA最新的Java应用服务器和工具为开发人员和架构师提供了利器,使他们的事件驱动型SOA解决方案可以有效的运行,并且可以节约成本和架构参数。我们使IT能引入新类型的服务和SLA,从而创造更大的价值。Java Application Server还可以帮助IT提供更好的客户满意度,这同样可以提升利润。EDSOA以其前摄性操作提供了更大的敏捷性,并且可以使您的机构更具竞争力和减少运作开销。这种独特的新运行时和架构有助于驱动快速开发,从而获得巨大的市场投放优势。
参考资料
原文出处:http://dev2dev.bea.com/pub/a/2007/07/building-event-server-app.html
| 作者简介 |
 Robin Smith |
Robin Smith 是BEA Systems的高级工程产品经理,主要负责WebLogic Time and Event Driven(TED)产品家族。 |
作者其它文章
|