来源:dev2dev
摘要
基于位置的信息系统将生成连续的数据流。比如说,物流公司各辆卡车的当前位置。WebLogic Event Server (WLEvS)可以高效且实时地处理位置数据,并能检测出重要的事件,比如接近特定地点或偏离预定路线。位置信息可与其他类型的数据相互关联,这利益于WLEvS的强大功能:处理海量数据提要并在它的事件处理语言(Event Processing Language,EPL)中捕获复杂的业务规则。
本文将介绍如何使用WLEvS和 Web 2.0 技术实现一个基于位置的用例。这个用例涉及到物流、运输、分销商和公共部门机构。
前往圣荷西
一辆卡车正从圣塔罗莎驶向圣荷西。我希望将卡车的位置显示在地图上,并在距目的地15英里之内提供报警。如图1所示。

图1. 红色标记表示卡车已接近圣荷西
本例将演示如何使用WLEvS在基于位置的信息系统中测试有用的条件,比如说接近某个位置。
本例的第二个目的是演示将WLEvS集成到已有的基础架构中构建功能复杂的应用程序。卡车的位置和WLEvS生成的接近报警将实时地显示在地图上。我将回顾数据库的集成、JMS服务器和所使用的Web 2.0技术。
解决方案大体分为两个主要组件:
使用WLEvS处理和通知 GPS 位置数据
使用 WebLogic Server 和 Yahoo! Maps 在地图 混搭 中显示位置和报警
使用WLEvS处理GPS数据
在生产环境中,卡车将携带一个GPS单元并将自己的位置传输给运行WLEvS的中央服务器。在本例中,我将使用WLEvS中的 loadgen 工具模拟GPS数据提要。我按照预先定义的时间间隔将位置坐标(经度和纬度)发送给WLEvS。WLEvS中实现的事件处理网络(Event Processing Network,EPN)如图2所示。

图2. 事件处理网络——EPN(单击图像查看大图)
Location事件进入EPN并通过两个并行分支进行处理:
距离计算分支(EPN图的上部)将检测输入位置距离目的地是否在15英里之内。如果检测到此条件,它将发送一个消息给WebLogic JMS Server上的JMS TOPIC。
事件记录分支(EPN图的下部)将捕获所有事件并将这些信息存储在一个数据库表。
我们仔细查看一下EPN。Loadgen工具将从文件中读取逗号分隔的值并通过TCP套接字将它们发送给WLEvS。WLEvS附带的csvAdapter将使用TCP服务器套接字接收这些值并将它们作为事件发送给相关的流组件。流组件再将事件分发给与之连接的所有处理器。
处理器将对传入事件应用事件处理语言(Event Processing Language)规则。如果事件与规则相符,则处理器再发送一个事件给相关的流组件。我将在下文中介绍预先定义在处理器中的规则。
每个分支的结束部分都有两个 POJO 组件用于接收事件并将数据发送给外部服务器。距离计算分支将生成接近报警将其作为消息发送给外部WebLogic JMS服务器上的JMS TOPIC。事件记录分支将使用JDBC连接到Oracle库并在其中插入所有GPS事件。
事件处理语言规则
EPL规则 将在EPN的处理器上执行。事件记录分支处理器将对所有经过的事件执行一个简单的规则:
select * from GPSInputEvent retain 1 event 在这个规则中,GPSInputEvent是存储库中注册的一种事件类型。它由含有事件数据的另一个POJO实现。
距离计算分支处理器中的规则比较复杂:
select * from (
insert into GPSDistanceEvent
select id, lat, lon, time, seq,
Utils.distance(lat, lon, 37.352889, -121.905531) as distance,
'San Jose, CA' as target
from GPSInputEvent
)
retain all events
where distance < 15 and target = 'San Jose, CA'
这个规则将根据与目的地的距离筛选GPS事件。内部的选择语句将计算当前位置与目的地之间的距离。用户定义的函数 Utils.distance 将执行计算,该函数是Java类的一个静态方法。输入参数为当前位置和目标位置的经度和纬度。函数的返回值为计算得出的距离,以供稍后在外部选择语句中使用。
使用内嵌选择语句的原因是距离函数只用计算一次。这提供了更佳的执行时间,尤其是当函数占用的CPU周期和I/O非常多时。
业务逻辑组件
接收处理器筛选事件的业务组件将使用标准JDBC和JMS API。
对于JDBC连接,数据源定义在 WLEvS域配置文件中(config/config.xml):
<data-source>
<name>oracle.xe</name>
<driver-params>
<url>jdbc:oracle:thin:@localhost:1521:XE</url>
...
</data-source>
业务逻辑组件可以使用@Service 方法注释 注入此数据源:
@Service(filter = "(Name=oracle.xe)")
public void setDataSourceService(DataSourceService dss) {
this.dataSource = dss.getDataSource();
}
对访问远程的WLS JMS Topic,EPN Assembly文件 中将定义一个 JNDI模板,如下所示:
<bean id="wlsjndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">
t3://localhost:7001
</prop>
</props>
</property>
</bean>
<bean id="outboundMessageAdapter"
class="com.bea.wlevs.demo.gpstracking.OutboundMessageAdapter"
factory-method="createInstance">
<constructor-arg ref="wlsjndiTemplate"/>
</bean>
Spring框架将bean注入组件,用于获取Topic的连接工厂和JNDI名称。通过使用这两个JNDI对象,组件可以将消息发送给JMS Topic。
The Big Picture
应用程序的用户接口将使用Web 2.0技术开发。图演示了如何通JMS和DB服务器检索WLEvS生成的信息的报警并最后显示在用户的浏览器中。

图3.解决方案的总体架构(单击图像查看大图)
这个Web应用程序 混搭 了 Yahoo! Maps JavaScript - Flash API 和运行在 WebLogic Server 10 上的 Beehive应用程序。浏览器将使用 Ajax 技术轮询(poll)WebLogic,获取自上次请求以来的新位置信息和报警。应用程序查询数据库并使用 JSON 格式发送新数据。页面中的JavaScript将在后台为地图添加新标记,而不需要用户介入或页面刷新。最终,页面将显示刚经过WLEvS实时处理的车辆的当前位置。有关用户接口的一些详细信息,请参见下图。

图 4. 从Atlanta出发,其中有两种不同的报警(单击图像查看大图)

图 5. 标记扩展信息和文本报警的细节
应用程序
WLEvS提供的基础架构将实时地检测基于位置的数据中的相关模式。我们可以使用这种功能实现一些激动人心的应用程序。下面是一些类别和示例:
数据报告验证。比如说,当车辆在特定时间段内未报告其位置,则系统将发出报警。
接近特定地点。即本文所使用的用例。
遵从已计划的管理约束,比如说:
当车辆未按照预期路线行驶时发出报警
当车辆速度高于允许的最低限速时发出报警
当车辆在特定时间段内未行驶时发出报警
当车辆可能无法按时抵达目的地时发出报警
编组需求。比如说,如果一些车辆在同一组中行驶,当这些车辆之间的距离超过5英里时发出报警。
关联各类数据。比如说,结合位置信息与车辆速度(同样由GPS单元提供),以及其他数据提要,如温度、动向、交通量、天气和RFID传感器。WLEvS 复杂事件处理(CEP)功能允许您设计复杂的规则和事件网络对复杂模式进行建模。
结束语
WebLogic Event Server非常适合用于在基于位置的信息系统中检测相关模式。由于其处理机制的实时性和低延时性,我们可以使用WebLogic Event Server设计监控和报警应用程序,以提醒一些重大事件,如接近、需求遵从、编组和复杂相关。
本文的用例使用WebLogic Event Server检测车辆与特定位置的接近事件,并使用Web 2.0技术通过一个动态的图形界面显示信息。
感谢 Alexandre Alves、David Read、James Taylor和Mark dos Santos对本文提供的帮助。