Tyrusを使用してWebSocketクライアントを作成しました。Java Tyrus WebSocket Client @OnMessageメソッドが「異なる」オブジェクトで呼び出されました
この問題は、@OnMessage
注釈付きインスタンスメソッドで発生します。
囲んでいるクラスの中には、両方とも競合するインスタンスコンテキストがあるように見える3つのものがあります。
- 私は親クラスにLoggerインスタンスを持っています。ゲッター
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が重複(コピー)オブジェクトまたはそのようなもののいずれかで呼び出されていると思います。
助けがあれば助かります。
tyrusは、クライアントエンドポイントの設定方法を考慮して、いくつかのクライアントエンドポイントクラスをインスタンス化することができます。注釈によって、またはインスタンス化されたオブジェクトを渡すことによって。コードスニペットをすべてのクラス宣言、WebSocket関連のアノテーション、およびクライアントサイドのtyrusランタイムの設定方法で更新してください。 – nandsito
それはまったく異なるテーマですが、 '@ OnMessage'はおそらくtyrus管理スレッドによって呼び出されるので、スレッドの干渉を気にしないでください。 – nandsito
簡単なテスト:インライン初期化の代わりにすべてのフィールドをコンストラクタで作成しようとしましたか? – nandsito