2017-04-25 63 views
0

我已經使用Tyrus創建了一個WebSocket客戶端。Java Tyrus WebSocket客戶端@OnMessage方法在'其他'對象上被調用

問題發生在@OnMessage帶註釋的實例方法中。

在封閉類中,我有三件東西似乎都有衝突的實例上下文。

  1. 我在父類中有一個Logger實例。獲取者getLogger()返回有效的記錄器實例。
  2. A 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()。

基於我的研究,基於對象的類的hashCode應該返回完全相同的hashCode。

這導致我相信processMessage在重複(複製)對象或類似的東西上被調用。

任何幫助將是偉大的。

+0

如果您設置了客戶端端點,例如,tyrus可能會實例化某些客戶端端點類。通過註釋或通過傳遞實例化對象。您能否使用所有類聲明,與websocket相關的註釋以及您如何設置客戶端的tyrus運行時來更新您的代碼片段? – nandsito

+0

這是一個完全不同的主題,但請注意,@ OnMessage可能是由一個Tyrus託管線程調用的,因此請注意線程干擾 – nandsito

+1

一個簡單的測試:您是否嘗試在構造函數中創建所有字段而不是內聯初始化? – nandsito

回答

0

而不是使用WebSocketContainer到connectToServer我用

ClientManager client = ClientManager.createClient(); 

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

看來WebSocketContainer如下找到一個服務提供商的公約,可能會出現的問題,因爲服務提供商可能已經有不同的實現(通話我的屁股在這裏)。

+1

左右有不同的實例解決問題嗎?接受答案,所以每個人都會知道它 – nandsito

+0

它說我必須等待2天。 –

+0

好吧,我不知道 – nandsito