Метод Java Tyrus WebSocket Client @OnMessage вызывается для «другого» объекта

Я создал клиент WebSocket, используя Tyrus.

Проблема возникает в аннотированном методе экземпляра @OnMessage.

Внутри окружающего класса у меня есть три вещи, которые, похоже, имеют конфликтующие контексты экземпляров.

  1. У меня есть экземпляр Logger в родительском классе. Геттер getLogger() возвращает действительный экземпляр регистратора.
  2. Объект LinkedList для постановки сообщений в очередь. Это вызывает исключение NullPointerException и является основной проблемой.
  3. Охватывающий объект экземпляра.

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 вызывается либо для дубликата (копии) объекта, либо для чего-то подобного.

Любая помощь будет здорово.


person Rohan Panchal    schedule 25.04.2017    source источник
comment
tyrus может создавать экземпляры некоторых классов конечных точек клиента в зависимости от того, как вы настроили конечную точку клиента, например. аннотацией или передачей созданного объекта. Не могли бы вы обновить свой фрагмент кода со всеми объявлениями классов, аннотациями, связанными с веб-сокетами, и тем, как вы настраиваете среду выполнения tyrus на стороне клиента?   -  person nandsito    schedule 25.04.2017
comment
это совсем другая тема, но имейте в виду, что @OnMessage, вероятно, вызывается потоком, управляемым tyrus, поэтому следите за вмешательством потока   -  person nandsito    schedule 25.04.2017
comment
простой тест: вы пытались создать все свои поля в конструкторе вместо встроенной инициализации?   -  person nandsito    schedule 25.04.2017
comment
@nandsito я пробовал. Не помогло.   -  person Rohan Panchal    schedule 25.04.2017
comment
важно посмотреть, как вы настраиваете клиент веб-сокета, а затем   -  person nandsito    schedule 25.04.2017
comment
@nandsito я добавил вызов, который я делаю в методе start, с тем, как инициируется соединение.   -  person Rohan Panchal    schedule 25.04.2017
comment
поскольку вы передаете экземпляр Class, tyrus создаст объект путем отражения для обслуживания сообщений веб-сокета. У вас будут разные экземпляры   -  person nandsito    schedule 25.04.2017


Ответы (1)


Вместо использования WebSocketContainer для подключения к серверу я использовал

ClientManager client = ClientManager.createClient();

client.connectToServer(this, URI.create("WebSocket URL here"));

Кажется, что WebSocketContainer следует соглашению о поиске поставщика услуг, и это могло быть проблемой, поскольку у поставщика услуг могла быть другая реализация (здесь я говорю из моей задницы).

person Rohan Panchal    schedule 25.04.2017
comment
проблема решена? примите ответ, чтобы все его знали - person nandsito; 25.04.2017
comment
Пишет что надо ждать 2 дня. - person Rohan Panchal; 25.04.2017