0

我使用Tyrus创建了一个 WebSocket 客户端。

问题发生在带@OnMessage注释的实例方法中。

在封闭类中,我有三件事似乎都有冲突的实例上下文。

  1. 我在父类中有一个 Logger 实例。gettergetLogger()返回有效的记录器实例。
  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() 时。

根据我的研究,基于对象的类上的 hashCode 应该返回完全相同的 hashCode。

这让我相信 processMessage 是在重复(复制)对象或类似对象上调用的。

任何帮助都会很棒。

4

1 回答 1

0

我没有使用 WebSocketContainer 连接到服务器

ClientManager client = ClientManager.createClient();

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

似乎 WebSocketContainer 遵循寻找服务提供者的约定,这可能是问题所在,因为服务提供者可能有不同的实现(在这里说出来我的屁股)。

于 2017-04-25T02:58:15.220 回答