在 Esper 中声明 Class 类型的实例变量并调用实例方法时不调用实例方法

Instance method not called when declaring a Class-type instance variable and call an instance method in Esper

我正在编写一个包含 esper 引擎的 class 实例的应用程序。我想使用来自引擎中 EPL 的实例方法调用来读取和设置许多实例变量。我没有收到任何编译错误并且代码运行。但是没有调用实例方法。

epl 语句:

module myModule;
create variable com.tp.main.MyClass myClass;
select myProperty from MyEvent unidirectional, method:myClass.getMyProperty() as myProperty;

一个提示可能是,如果我不使用 method: 方法调用前面的关键字,我会得到一个错误,即无法找到 myClass.getMyProperty class。文档有时使用 method: 关键字,有时不在示例中用于从 Class 类型变量调用实例方法。

我也试过在 API 中使用 addVariable 方法得到相同的结果。

方法代码。

public Result getMyProperty() {
    Result result = new Result();
    result.setResult("propertyValue");
    logger.info("This method was called");
    return result;
}

class 结果是一个带有 getter 和 setter 字符串的 POJO。

public class Result {
    private String result;

    public String getResult() {
        return result;
    }
    public void setResult(String str) {
        result = str;
    }
}

我错过了什么?

您可以查看回归测试 class。您可能想要查看的具体一个是 ExecFromClauseMethodVariable。也许你的代码没有给变量赋值?

Github: https://github.com/espertechinc/esper/blob/3e396d77308532b202ee452100eaaf9e7a044906/esper-regression/src/test/java/com/espertech/esper/regression/epl/fromclausemethod/ExecFromClauseMethodVariable.java

问题已解决,我认为分享解决方案可能会有用。感谢 user650839 为我指明了正确的方向。这是最终解决问题的方法。

我恢复到在运行时配置中声明变量 API。我发现我必须注册变量 class,用实例对象 (this) 初始化它,最后导入 class。这是在运行时配置 API.

中执行此配置的代码片段
Configuration configuration = new Configuration();
configuration.addVariable("myClass", com.tp.main.MyClass.class, this);
configuration.addImport(com.tp.main.MyClass.class);
epService = EPServiceProviderManager.getProvider(trade.getTradeName(), configuration);

在 EPL 中声明 Class 变量时似乎有限制。您不能使用要使用的实例对象对其进行初始化。在运行时配置 API 中,我能够使用包含我想从 EPL 访问的所有实例变量的对象的 "this" 实例对其进行初始化。

EPL 声明没有改变。但是,似乎您必须在方法调用前使用关键字 method: 否则会出现错误 "cannot find class..."