2017-04-25 24 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