我已經使用Tyrus創建了一個WebSocket客戶端。Java Tyrus WebSocket客戶端@OnMessage方法在'其他'對象上被調用
問題發生在@OnMessage
帶註釋的實例方法中。
在封閉類中,我有三件東西似乎都有衝突的實例上下文。
- 我在父類中有一個Logger實例。獲取者
getLogger()
返回有效的記錄器實例。 - A
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()。
基於我的研究,基於對象的類的hashCode應該返回完全相同的hashCode。
這導致我相信processMessage在重複(複製)對象或類似的東西上被調用。
任何幫助將是偉大的。
如果您設置了客戶端端點,例如,tyrus可能會實例化某些客戶端端點類。通過註釋或通過傳遞實例化對象。您能否使用所有類聲明,與websocket相關的註釋以及您如何設置客戶端的tyrus運行時來更新您的代碼片段? – nandsito
這是一個完全不同的主題,但請注意,@ OnMessage可能是由一個Tyrus託管線程調用的,因此請注意線程干擾 – nandsito
一個簡單的測試:您是否嘗試在構造函數中創建所有字段而不是內聯初始化? – nandsito