Complex event processing 如何创建Esper语句并以原子方式设置订阅服务器,以便不会错过任何更新?

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

我有一个使用Esper运行CEP的多线程程序。当事件已经通过引擎发送时,我创建一个新语句并设置订阅服务器。由于
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();
}