Complex event processing 如何创建Esper语句并以原子方式设置订阅服务器,以便不会错过任何更新?
我有一个使用Esper运行CEP的多线程程序。当事件已经通过引擎发送时,我创建一个新语句并设置订阅服务器。由于Complex event processing 如何创建Esper语句并以原子方式设置订阅服务器,以便不会错过任何更新?,complex-event-processing,esper,Complex Event Processing,Esper,我有一个使用Esper运行CEP的多线程程序。当事件已经通过引擎发送时,我创建一个新语句并设置订阅服务器。由于createpl方法会自动启动语句,因此在启动语句和设置订阅服务器之间,我可能会错过由语句触发的更新。考虑这个例子: EPStatement myStatement = epService.getEPAdministrator().createEPL(myStatementString); // another thread sends an event that triggers my
createpl
方法会自动启动语句,因此在启动语句和设置订阅服务器之间,我可能会错过由语句触发的更新。考虑这个例子:
EPStatement myStatement = epService.getEPAdministrator().createEPL(myStatementString);
// another thread sends an event that triggers my statement which at this moment has no subscribers
myStatement.setSubscriber(MySubscriber.this);
// now my subscriber will get updates but it potentially missed some since the statement was created
我可以创建自己的锁来处理这个问题,但我想知道它们是否是同时创建语句和设置ESPERAPI提供的订阅服务器的替代方法?或者,它们是一种在不自动启动eStatement的情况下创建eStatement的方法,这样我就可以分配订阅服务器,然后手动启动该语句?您需要获得一个锁,并在锁内执行多个与部署相关的步骤。 文件中有
我使用的是一个旧版本,其中getRuntimeInstanceWideLock()方法不可用。以前在旧版本的Esper中实现这一点的方法是什么?
runtime.getRuntimeInstanceWideLock().writeLock().lock();
// Start atomic management unit.
// Any events concurrently being processed by other threads must complete before the code completes obtaining the lock.
// Any events sent in by other threads will await the release of the lock.
try {
// Perform operations such as :
// - deploy and/or undeploy multiple compiled modules (deployment admin API)
// - set statement listeners and subscribers while deploying
// There is no need to obtain this lock when deploying or undeploying a single module.
// The lock is reentrant and can be safely taken multiple times by the same thread.
// Make sure you use "try" and "finally" just like we have it here.
}
finally {
// Complete atomic management unit.
// Any events sent in by other threads will now continue processing against the changed set of statements.
runtime.getRuntimeInstanceWideLock().writeLock().unlock();
}