You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Esper 8.9监听器getUnderlying()返回空值问题

问题原因分析

从日志可见,监听器收到的是MapEventBean而非预期的POJO类型事件,getUnderlying()返回空HashMap的核心原因是:Esper模式匹配的结果默认会封装为Map结构,而非直接返回原始POJO事件。这个Map的键对应你在EPL模式中定义的事件别名,若模式未指定别名或EPL语句定义不当,就会出现空Map的情况。

另外,你在监听器中直接将getUnderlying()的结果强转为EventWrapperDto是错误的,因为此时底层对象是模式匹配结果的Map,而非原始事件POJO。

解决方案

1. 修正EPL模式语句,指定事件别名

确保在模式匹配的EPL中为每个要捕获的事件指定别名,例如:

// 示例:匹配先后发生的两个特定EventWrapperDto事件,分别命名为e1和e2
pattern [
    e1=EventWrapperDto(name='OperationalData:temperature_of_the_bar') -> 
    e2=EventWrapperDto(name='OperationalData:product_id')
]

别名(如e1、e2)会作为后续提取事件的键。

2. 修改监听器代码,正确提取原始POJO事件

从模式结果的Map中通过别名获取对应的原始EventBean,再提取其底层POJO:

statement.addListener((newData, oldData, stmt, rt) -> {
    log.info("Received new data: {}", newData.toString());
    log.info("Received old data: {}", oldData);
    if (newData != null) {
        try {
            List<EventWrapperDto> matchedEvents = Arrays.stream(newData)
                    .map(eventBean -> {
                        // 模式匹配结果是Map,键为EPL中定义的事件别名
                        Map<String, EventBean> patternResult = (Map<String, EventBean>) eventBean.getUnderlying();
                        log.info("Pattern result map contents: {}", patternResult);
                        
                        // 根据别名提取原始事件
                        EventWrapperDto e1 = (EventWrapperDto) patternResult.get("e1").getUnderlying();
                        EventWrapperDto e2 = (EventWrapperDto) patternResult.get("e2").getUnderlying();
                        
                        log.info("Extracted event 1: {}", e1);
                        log.info("Extracted event 2: {}", e2);
                        
                        return Arrays.asList(e1, e2);
                    })
                    .flatMap(List::stream)
                    .toList();
            log.info("Pattern found, combining events: {}", matchedEvents);
        } catch (Exception e) {
            log.error("Error processing events", e);
        }
    }
});

3. 确保Esper事件类型配置正确

在Esper配置中直接传入EventWrapperDto的Class对象,而非类名字符串,避免类加载问题:

@Configuration
public class EsperConfiguration {

    @Bean
    public EPRuntime epServiceProvider() {
        com.espertech.esper.common.client.configuration.Configuration config = new com.espertech.esper.common.client.configuration.Configuration();
        // 直接传入Class对象,确保Esper识别为POJO类型
        config.getCommon().addEventType("EventWrapperDto", EventWrapperDto.class);
        return EPRuntimeProvider.getDefaultRuntime(config);
    }
}

内容的提问来源于stack exchange,提问作者ksalg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:12:01