Esper:创建新的Esper语句,并跳过已经存在的语句

时间:2018-08-14 14:03:10

标签: java validation esper

我正在研究的项目使用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部分,因此它从不检查异常。

1 个答案:

答案 0 :(得分:1)

您可以从EPAdministrator.getStatementNames()EPAdministrator.getStatement(String name)获取当前存在的语句。

比较语句是否已存在取决于您的应用程序,但是EPStatement.getText()会返回EPL