我已经使用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