Я создал клиент WebSocket, используя Tyrus.
Проблема возникает в аннотированном методе экземпляра @OnMessage
.
Внутри окружающего класса у меня есть три вещи, которые, похоже, имеют конфликтующие контексты экземпляров.
- У меня есть экземпляр Logger в родительском классе. Геттер
getLogger()
возвращает действительный экземпляр регистратора. - Объект
LinkedList
для постановки сообщений в очередь. Это вызывает исключение NullPointerException и является основной проблемой. - Охватывающий объект экземпляра.
private LinkedList<String> messageQueue = new LinkedList<>();
private Logger logger = LoggerFactory.fromClass(WebSocketClient.class);
public Logger getLogger() {
return logger;
}
public WebSocketClient() {
super();
this.getLogger().info(this.toString());
}
public start() {
try {
WebSocketContainer webSocketContainer = ContainerProvider.getWebSocketContainer();
this.connectionSession = webSocketContainer.connectToServer(WebSocketClient.class, URI.create("WebSocket URL here"));
} catch (Exception exception) {
this.getLogger().error("Exchange Client Start Error", exception);
}
}
@OnMessage
public void processMessage(String message) {
// This returns the correct Logger instance
this.getLogger().info("Received Message: " + message);
// This Returns a different hashCode()
this.getLogger().info(this.toString());
// This throws a NullPointerException
this.messageQueue.add(message);
}
Благодаря моей отладке в конструкторе, когда я регистрирую this.getLogger().info(this.toString());
и возвращаю правильный пакет, имя класса с @hashCode().
Но когда я регистрирую его в методе processMessage() и возвращаю совершенно другой hashCode().
Основываясь на моем исследовании, хэш-код для классов на основе объектов должен возвращать точно такой же хэш-код.
Это наводит меня на мысль, что processMessage вызывается либо для дубликата (копии) объекта, либо для чего-то подобного.
Любая помощь будет здорово.
@OnMessage
, вероятно, вызывается потоком, управляемым tyrus, поэтому следите за вмешательством потока - person nandsito   schedule 25.04.2017start
, с тем, как инициируется соединение. - person Rohan Panchal   schedule 25.04.2017Class
, tyrus создаст объект путем отражения для обслуживания сообщений веб-сокета. У вас будут разные экземпляры - person nandsito   schedule 25.04.2017