java.lang.ClassCastException 在 Jetty 中使用 Spring Session with Redis 并结合 SseEmitter
java.lang.ClassCastException in Jetty when using Spring Session with Redis in combination with SseEmitter
我正在使用 Jetty 9.4(但我也尝试过 9.2)、spring-data-redis
1.8.6 和 Spring 4.2。我本质上是在使用 org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration
提供的默认配置,一切似乎都工作正常,直到我添加一个 Controller
的端点 returns org.springframework.web.servlet.mvc.method.annotation.SseEmitter
:
@RequestMapping(value = "sse", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<SseEmitter> sse() {
SseEmitter emitter = new SseEmitter();
emitter.onCompletion(..);
emitter.onTimeout(..);
storeEmitterInHashMap(emitter);
return ResponseEntity.ok().header("Cache-Control", "no-store").body(emitter);
}
似乎发生的情况是,当 SSE 连接在 30 秒后出现连接超时时,Spring/Jetty 会尝试关闭侦听器。但是由于控制台中打印的 ClassCastException
而失败:
[WARNING] java.lang.ClassCastException:
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper
cannot be cast to org.eclipse.jetty.server.session.SessionHandler$SessionIf
while invoking onComplete listener
org.eclipse.jetty.server.session.SessionHandler$SessionAsyncListener@67e50aa3
这大约每 30 秒发生一次。如果我导航到另一个未连接到 SSE 端点的页面,警告就会消失。
这有什么好担心的吗?是什么原因造成的?我该如何解决?
这是 Jetty 中的 bug,并在版本 9.4.13.v20181111
中修复。
我正在使用 Jetty 9.4(但我也尝试过 9.2)、spring-data-redis
1.8.6 和 Spring 4.2。我本质上是在使用 org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration
提供的默认配置,一切似乎都工作正常,直到我添加一个 Controller
的端点 returns org.springframework.web.servlet.mvc.method.annotation.SseEmitter
:
@RequestMapping(value = "sse", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<SseEmitter> sse() {
SseEmitter emitter = new SseEmitter();
emitter.onCompletion(..);
emitter.onTimeout(..);
storeEmitterInHashMap(emitter);
return ResponseEntity.ok().header("Cache-Control", "no-store").body(emitter);
}
似乎发生的情况是,当 SSE 连接在 30 秒后出现连接超时时,Spring/Jetty 会尝试关闭侦听器。但是由于控制台中打印的 ClassCastException
而失败:
[WARNING] java.lang.ClassCastException:
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper
cannot be cast to org.eclipse.jetty.server.session.SessionHandler$SessionIf
while invoking onComplete listener
org.eclipse.jetty.server.session.SessionHandler$SessionAsyncListener@67e50aa3
这大约每 30 秒发生一次。如果我导航到另一个未连接到 SSE 端点的页面,警告就会消失。
这有什么好担心的吗?是什么原因造成的?我该如何解决?
这是 Jetty 中的 bug,并在版本 9.4.13.v20181111
中修复。