問題タブ [tyrus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - ServerEndpoint のすべてのメソッドは異なるスレッドによって実行されますか?
JavaEE サーバーとして GF 4 を使用しています。
これが私がサーブレット処理を理解する方法です。スレッドのプールがあり、リクエストが来ると、このプールから1つのスレッドがリクエストを処理するために取られます。その後、スレッドはプールに戻されます。
上記の情報に基づいて、websocket (サーバーエンドポイント) は次のように処理されると思います (よくわかりません): スレッドのプールがあります。
- クライアントは新しい WebSocket を作成し、プールからスレッドを取得して ServerEndpoint の新しいインスタンスを作成し、@OnOpen メソッドを実行します。その後、スレッドはプールに戻されます。
- クライアントは、WebSocket を介してサーバーにメッセージを送信します。@OnMessage メソッドを実行するためにプールからスレッドが取得されます。その後、スレッドはプールに戻されます。
- クライアントが websocket を閉じます - @OnClose メソッドを実行するためにプールからスレッドが取得されます。その後、スレッドはプールに戻されます。
つまり、ServerEndpoint のすべてのメソッドを異なるスレッドで実行できるということです。私の理解は正しいですか?
jakarta-ee - javax.websocket.Session.isOpen() メソッドはどのように機能しますか?
クライアントと Javaee サーバーの間に WebSocket が開いているとします。セッションがまだ開いているかどうかを確認するために使用できるメソッド session.isOpen() があります。しかし、このメソッドを返すものと、クライアント コンピューターが突然オフになった場合、またはユーザーがページを離れたが、js スクリプトが接続を閉じなかった場合の理由は何ですか。この方法はどの程度信頼できますか?
java - javax.websocket ライブラリのエラー
ここの例に従っているだけです: javax.websocket クライアントの簡単な例
私のmavenリポジトリは次のようになります:
しかし、私はエラーメッセージを理解できません:
何が問題ですか?
java - SSL を使用してスタンドアロンの Tyrus Websocket サーバーを実行することは可能ですか?
ローカル Websocket サーバーを実行する Java Web Start アプリケーションがあります。このアプリは、いくつかのデータを受け取り、これらのデータに署名し、WebSocket 接続を介して署名されたデータをブラウザーに返します。Tyrus コンテナーをローカル WebSocket サーバーとして使用しています。最近、私は立ち往生していることに気付きました: ブラウザーは ssl コンテキストで ws への接続を確立しようとしますが、私の ws サーバーは保護された websocket 接続をサポートしていません。
次のエラーが発生しました。
混合コンテンツ: ' https://example.com ' のページは HTTPS 経由で読み込まれましたが、安全でない WebSocket エンドポイント 'ws://localhost:8025/sign/' に接続しようとしました。このリクエストはブロックされました。このエンドポイントは、WSS 経由で利用できる必要があります。
Uncaught SecurityError: 'WebSocket' の構築に失敗しました: 安全でない WebSocket 接続は、HTTPS 経由で読み込まれたページから開始されない可能性があります。
言い換えれば、Tyrus は私にそのようなものを与えません:
Tyrus Server を SSL で実行する方法はありますか、それとも別の自己完結型の Websocket サーバーを知っている人はいますか?
前もって感謝します
java - Tyrus Websocket クライアント @OnMessage が呼び出されない - Storj オープン ソース プロジェクト
私はオープン ソース プロジェクト、Storj に取り組んでいます。Node.js websocket バックエンドに接続する Java クライアントを作成しています。クライアントは Tyrus を使用します。通信は次のように行われる必要があります。
- 接続
- クライアントは認証トークン (テキスト) を送信します。
- サーバーはファイルを送り返します (バイナリ)。
- サーバーは接続を閉じます。
@OnMessage が呼び出されないため、問題が発生しています。ここで、同じURLと同じトークンを使用して、単純なjavascriptクライアントをオンラインで試しました: https://www.websocket.org/echo.html
これを使用すると、Java プロジェクトに何か問題があることを示す応答が返されます。
ファイルをダウンロードする前の早い段階で、問題なくファイルをアップロードできます。ただし、そのステップでは @OnMessage を呼び出す必要はありません (ファイルをアップロードするだけで、サーバーはメッセージで切断されます)。そのため、@OnMessage が機能しているかどうかはわかりません。
Websocket に関連するコードは次のとおりです (Github でも入手可能): https://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io /client/websockets/WebsocketFileRetriever.java
そして、この websocket を開始するコードは、 https://github.com/NutterzUK/storj-java-bridge-client/blob/master/storj-client/src/main/java/storj/io/client/DefaultStorjClientで入手できます。 .java :
Tyrus を最新バージョンにアップグレードしてみましたが、同じ結果が得られました。何か案は?
このコードの出力は次のとおりです。
メッセージを送信した後、@OnClose からの「NORMAL_CLOSURE」メッセージの前にしばらくハングします。
更新:これを実行して問題を再現する非常に簡単な方法
テスト用のユーザー名とパスワードを git リポジトリに追加したので、利用可能なコードは次のとおりです: https://github.com/NutterzUK/storj-java-bridge-client
実行するには、storj.io.client.main.MainTest を実行するだけです。
それが何をするかの簡単な実行。まず、トークンを取得するためにいくつかの HTTP 要求を送信します。そのトークンを使用して Websocket 経由で誰かのマシンに接続し、そのトークンをテキストとして送信します。応答として、ファイルをバイトとして受け取る必要があります。
接続する前に、接続しようとしているトークンとアドレスを出力します。閉じられる前に少しハングし、onMessage メソッドは呼び出されません。テストのために、そこに System.exit を配置すると (DefaultStorjClient.java の行 152 のコメントを外す)、接続されないため、別のクライアントでそのトークンを使用できます。https://www.websocket.org/echo.htmlを使用してテストしました (「wss」ではないため、ブラウザーが安全でない URL を許可することを確認してください。Chrome でこれを行うには、上部のシールドをクリックする必要がありますサーバーが応答していることがわかります。
これは、テキスト メッセージへの応答として blob が実際に送信されることを示していますが、Tyrus の @OnMessage は起動されません。
tomcat - Tomcat 8 および非 Atmosphere クライアントでの Atmosphere+Jersey エラー
WebSocket サポートのフレームワークとして Atmosphere を使用するチャット サーバーを実行しています。私はatmosphere-jersey maven依存関係を使用しているため、AtmosphereはJerseyを使用しています。
チャット サーバーは Tomcat 7 で実行されており、Tomcat 8 にアップグレードしています。
私たちのクライアントの 1 つは、Tyrus を Java websocket API として使用しています。
チャット サーバーが Tomcat 7 (Java 6、7、または 8) にデプロイされている場合、問題はありません。
Tomcat 8 (Java 8) 上のチャット サーバーでは、Atmosphere を使用するテスト クライアントは正常に動作しますが、Tyrus を使用するクライアントは動作しません。表示されるエラーは次のとおりです。
これは、Tomcat 7 では、Websocket リクエストからのリクエスト URL が「http://localhost:8080/chat/」のように見えるために発生します (リクエストは ws://localhost:8080/chat/ に対して行われますが、変更されています)。 http://どこかに)。しかし、Tomcat 8 では、websocket リクエストからのリクエスト URL は "/chat/" のようになり、スキーマが存在せず、Jersey がエラーをスローします。
これに対処するために、Atmosphere は、Atmosphere クライアントが要求を行うときにスキーマを持つヘッダー「origin」を探します。しかし、Tyrus クライアントがリクエストを行うと、その "origin" ヘッダーに http スキーマが含まれていないため、上記のエラーが発生します。
誰かがこれに対する簡単な解決策のアイデアを持っているか、同様の問題に遭遇したかどうか疑問に思っています. 簡単な解決策をたくさん探しましたが、まだ見つかりません。これがなければ、Atmosphere の使用をやめて、多くのコード リファクタリングを行う別のものを使用する必要があると考えています。
これらは、この問題に対処しているように見えるこの問題に関するチケット/バグへのリンクですが、私は正しいバージョンを持っていますが、まだ問題があります。
https://bz.apache.org/bugzilla/show_bug.cgi?id=56573 https://github.com/Atmosphere/atmosphere/issues/1839
大気バージョン: 2.4.8
ジャージのバージョン (大気経由): 1.19
Tyrus バージョン: 1.13
servlets - Weblogic 12.2.1.2 - websocket エンドポイント - このリクエストでは非同期サポートが無効になっています
これから提起しようとしている質問に対する答えはすでにあります。
いずれにしても、JEE 6 から JEE 7 に移行し、websocket の使用を考えている人々 (たとえば、長いポーリングを websocket 機能で置き換えるなど) に役立つように、ここで質問しています。
質問: JEE 7 をサポートする Weblogic 12.2.1.2 で、次のようなガイドを使用して Websocket をセットアップしようとしています: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HomeWebsocket/WebsocketHome。 html
注: 上記のガイドは非常に単純であり、すべて正しく、機能するはずです。私のアプリケーションではうまくいかなかったので、必ずしもあなたのアプリケーションでうまくいくとは限りません。しかし、概念的にはそうすべきです。
それにもかかわらず。HTTP 接続が tcp/ip Web ソケット接続にアップグレードされることになっている、ブラウザから backed へのハンドシェイク中に websocket アプリケーションがエラーになります。
Weblogic は、tyrus が Ascyn サーブレットの動作を使用してこのハンドシェイク プロトコルを処理できないと訴えています。ハンドシェイク中のエラーのスタック トレースを次に示します。
2017-01-23 14:54:59,065 ThreadId:53 エラー HTTP - [ServletContext@129852715[app:primefaces-60 モジュール:primefaces-60path:null spec-version:3.1]] サーブレットが例外 <[ACTIVE] ExecuteThread: '5' for queue: 'weblogic.kernel.Default (self-tuning)'> java.lang.IllegalStateException: The async-support で失敗しましたこのリクエストでは無効になっています: weblogic.servlet.internal.ServletRequestImpl@2c87c663[ GET /primefaces-60/actions HTTP/1.1 接続: アップグレード プラグマ: no-cache キャッシュ制御: no-cache アップグレード: websocket オリジン: http://ローカルホスト:7001Sec-WebSocket-Version: 13 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/55.0.2883.87 Safari/537.36 DNT: 1 Accept-Encoding: gzip、deflate、sdch , br Accept-Language: en-US,en;q=0.8,pt-PT;q=0.6,pt;q=0.4,fr;q=0.2,it;q=0.2,de;q=0.2 Sec-WebSocket -キー: flKcAkxO3CJBIc8cYvwvlA== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
] weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2029) で weblogic.servlet.internal.ServletRequestImpl.startAsync(ServletRequestImpl.java:2005) で javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:432) でweblogic.websocket.tyrus.TyrusServletFilter.doFilter(TyrusServletFilter.java:241) で weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) で filter.DummyTimeoutFilter2.doFilter(DummyTimeoutFilter2.java:81) で weblogic. weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32) の servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) .servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3683) の weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3649) の weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326) weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) で weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) で weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) で) weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2433) で weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2281) で weblogic.servlet.internal.WebAppServletContext で。execute(WebAppServletContext.java:2259) で weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1691) で weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1651) で weblogic.servlet.provider.ContainerSupportProviderImpl $WlsRequestExecutor.run(ContainerSupportProviderImpl.java:270) の weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:348) の weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:333) の weblogic.work.LivePartitionUtility.doRunWorkUnderContext( LivePartitionUtility.java:54) で weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) で weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:640) weblogic.work.ExecuteThread.execute(ExecuteThread.java:406) で weblogic.work.ExecuteThread.run(ExecuteThread.java:346) で
Websocket エンドポイントをセットアップするためのバックエンド コードが完璧であり、Websocket 接続を確立するために使用される JavaScript コードが完璧であるという前提に基づいています。手紙のガイドに従って、上記のエラーが発生した理由を誰かが説明できますか?
注: - 上記のスタック トレースは、実際のアプリケーションの分析に基づいて、動作中の websocket エンドポイントを持つサンプル アプリケーションで既に分離されており、上記の例外に破損しています。
あなたがそれを知っていれば、答えは簡単です...誰も正しい解決策を取り戻す権利がない場合、私は1日かそこらで答えます.