我们正在开发车辆跟踪系统。像每个VTS一样,我们在车辆中安装了GPS设备,这些设备不断向服务器发送位置信息。在服务器上,我们的TCP通信器进程不断读取该数据并将其保存到数据库中 现在,我们需要检查一些规则来触发车辆的警报,例如,当车辆到达特定位置时,如果车辆超过特定的速度限制等,我们需要警报。 能否请您建议实施它的最佳方法? 我们已经想到了实现它的一些方法, 1.我们的TCP通信器在收到位置时,应检查警报。 2.将有一个流程每15分钟运行一次,并在15分钟内检查位置详细信息以进行提醒。
我正在寻找实施它的建议,逻辑方面以及技术方面。例如我们是否应该使用Drools?等等。
答案 0 :(得分:6)
联邦快递的某些人在几年前参加的JavaOne会议上实际上提出了类似的内容。
基本上,我的想法是,使用Drools Expert + Fusion对车辆位置数据执行CEP(复杂事件处理)。
据我所知,车辆会定期(每隔几秒钟)将GPS坐标发送到引擎(事件),然后由规则引擎消化,并根据规则触发确定诸如提醒警报(“车辆停滞”或“不在路上”)或发送通知(“车辆将在约15分钟内到达目的地”)等行动。
(Google "drools fusion cep vehicle tracking"发布this演示文稿,该内容可为您提供更多详细信息或至少提供一些见解。)
答案 1 :(得分:2)
我建议您制作一个对象,其中包含从规则中获取的所有数据,并将其放入工作记忆中。
在Drools中你应该制定许多小规则,每个规则只检查一件事并对结果采取行动。
让Drools获得评估所需的数据并不是一个好习惯,但是我不能看到让Drools触发某些事件的任何问题,这些事件会向车辆或其他系统发送消息。 (我想这应该是异步的,所以你不要放慢Drools的速度)事实上,Drools会让你联系一个eventlistener。
答案 2 :(得分:0)
没有理由每15分钟跑一次。这将引入触发器的延迟,并且每15分钟就会导致负载突发,然后是无负载时段。
您可以在数据库中拥有新警报规则和新位置数据的标志。扫描事件时,可以使用两遍方法。检查所有位置数据的所有新规则,并将其标记为新的。然后根据现有规则检查所有新位置数据,并将其标记为不再是新的。
您可以根据需要随时运行。理想情况下,你不会等那么久,因为你等待的时间越长,你积累的工作就越多。
至于让TCP通信器检查数据库定期接近扫描的相关警报,主要优点是警报是即时的。缺点是警报处理会减慢TCP通信器路径,并且您将被锁定为“一次更新意味着一次检查警报”模型。
在“扫描数据库”方法中,如果负载过高,您最多只能在高频更新源的每次更新中检查警报。这自然会通过减少所需的工作量来处理负载,但可能会导致错过警报。
我认为您正在考虑的所有方法都可以正常使用。