gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:54:58 24 4
gpt4 key购买 nike

我正在从事的项目使用 Esper 创建监控规则。这些规则是 Activity 的还是非 Activity 的,取决于 SQL 行中的 boolean 值。我想设置一个检查以查看是否有任何新的 Activity 规则,从中创建一个语句,并将它们添加到 HashMap 中。这将使用 Spring 调度程序定期运行。到目前为止的代码如下所示:

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);
}
}

在初次运行时,效果很好。生成语句并将其添加到 hashmap 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 语句是否已存在,并在存在时跳过该规则?到目前为止,我已经 try catch 异常并简单地返回一个日志,指出 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 循环是错误的。程序在创建语句时将失败,并且由于该语句位于循环的 else 部分,因此它永远不会检查异常。

最佳答案

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

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

关于java - Esper:创建新的 Esper 语句,并跳过已存在的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51843341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com