我正在研究的项目使用Esper创建监视规则。这些规则基于SQL行中的布尔值是有效的还是无效的。我想设置一个检查以查看是否有任何新的活动规则,从中创建一条语句,然后将其添加到哈希图中。这将使用Spring Scheduler定期运行。到目前为止的代码如下:
private void refreshStatement(Rule rule) throws Expression {
List<String> allRules = dao.getAllRules();
for (String rule : allRules) {
EPStatement statement = epService.getEPAdministrator().createEPL(rule);
statement.addListener(new RuleListener(rule));
ruleMap.put(rule.getId(), statement);
}
}
在初次运行时,它可以正常运行。这些语句已生成并添加到哈希图ruleMap
中。但是,由于调度程序而使方法第二次运行时,该方法由于看到的第一个规则已存在而失败。例如:
ERROR [2018-08-14 12:00:00,000] org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler: Unexpected error occurred in scheduled task.
! com.espertech.esper.epl.expression.core.ExprValidationException: Context by name 'Test_Case' already exists
是否有什么好的方法来检查Esper语句是否已经存在,并跳过该规则(如果存在)?到目前为止,我已经尝试捕获异常并仅返回一条日志,指出该EPL语句已存在,这样仅创建新语句:
private Exception e;
private void refreshStatement(Rule rule) throws Exception {
List<String> allRules = dao.getAllRules;
for (String rule : allRules) {
if (e instanceof ExprValidationException) {
log.info("The EPL statement already exists")
}
else {
EPStatement statement = epService.getEPAdministrator().createEPL(rule);
statement.addListener(new RuleListener(rule));
ruleMap.put(rule.getId(), statement);
}
}
}
但是,我仍然有同样的例外。
编辑:我刚刚意识到我写了for循环错误。程序在创建statement
时将失败,并且由于它位于循环的else部分,因此它从不检查异常。
答案 0 :(得分:1)
您可以从EPAdministrator.getStatementNames()
和EPAdministrator.getStatement(String name)
获取当前存在的语句。
比较语句是否已存在取决于您的应用程序,但是EPStatement.getText()
会返回EPL
。