Я использую 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
, у которого есть конечная точка, которая возвращает 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);
}
Похоже, что происходит, когда по истечении 30 секунд время ожидания соединения с SSE истекает, 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, предупреждение исчезает.
Не о чем ли беспокоиться? Чем это вызвано? Как я могу это исправить?