java.lang.ClassCastException в Jetty при использовании Spring Session с Redis в сочетании с SseEmitter - PullRequest
0 голосов
/ 31 октября 2018

Я использую 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, предупреждение исчезает.

Не о чем ли беспокоиться? Чем это вызвано? Как я могу это исправить?

1 Ответ

0 голосов
/ 14 ноября 2018

Это ошибка в Jetty и исправлена ​​в версии 9.4.13.v20181111.

...