2017-04-25 9 views
0

Tyrusを使用してWebSocketクライアントを作成しました。Java Tyrus WebSocket Client @OnMessageメソッドが「異なる」オブジェクトで呼び出されました

この問題は、@OnMessage注釈付きインスタンスメソッドで発生します。

囲んでいるクラスの中には、両方とも競合するインスタンスコンテキストがあるように見える3つのものがあります。

  1. 私は親クラスにLoggerインスタンスを持っています。ゲッターgetLogger()は有効なロガーインスタンスを返します。
  2. LinkedListメッセージをエンキューするオブジェクトです。これはNullPointerExceptionをスローし、コアの問題です。
  3. 囲むインスタンスオブジェクト。コンストラクタで私のデバッグを通じ
  4. 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

代わりのConnectToServer関数にWebSocketContainerを使用して、私はそれはWebSocketContainerは、サービスプロバイダを見つけるの慣例に従い、サービスプロバイダが異なる実装を持っていた可能性があるのでそれは(トーキング問題だったかもしれないようだ

ClientManager client = ClientManager.createClient(); 

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

を使用ここで私のお尻から)。

+1

は解決された問題ですか?答えを受け入れるように誰もがそれを知っている – nandsito

+0

それは私が2日待たなければならないと言います。 –

+0

ok、私はそれを知らなかった – nandsito

関連する問題