我使用Tyrus创建了一个 WebSocket 客户端。
问题发生在带@OnMessage
注释的实例方法中。
在封闭类中,我有三件事似乎都有冲突的实例上下文。
- 我在父类中有一个 Logger 实例。getter
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() 时。
根据我的研究,基于对象的类上的 hashCode 应该返回完全相同的 hashCode。
这让我相信 processMessage 是在重复(复制)对象或类似对象上调用的。
任何帮助都会很棒。