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
相关产品推荐
相关产品推荐

