3

デスクトップ アプリケーション (WinForm) を Web アプリケーション (Java/Spring/JPA) に移植する作業を行っています。問題点が多くて、ちょっと苦戦中…

今問題はスレッドです!

DB から特定のデータのエクスポートを実行する元のアプリケーションには、プロセスの進行状況を示す進行状況バーがあります。

この進行状況バーを新しい Web アプリケーションに移植したいと考えています。これを行うには、AJAX を使用し、別のスレッドを使用してデータ エクスポートを実行することを考えました。

主な懸念事項は次のとおりです。

  • 私は正しいアプローチに従っていますか?Web アプリケーションでマルチスレッドを使用する際に問題はありますか?
  • エクスポート プロセス中に F5 キーまたは更新ボタンを押すと、正確には何が起こりますか? どうすればプロセスを停止できますか?
  • プログレスバーを定期的に更新するにはどうすればよいですか? サーバーへの ajax 経由で呼び出しを行う必要がありますか?
4

3 に答える 3

1

私は主に ASP.Net 開発者ですが、HTTP プロトコルについて知っている限りでは、これを行う方法はありません。私はこれに対してかなり巧妙な解決策をたくさん見てきましたが、最終的に明らかになったのは、HTTP プロトコルは単にこのように機能するように設計されていないということです。

明らかに、Flash または Silverlight アプリでこれを実行できることは認識していますが、それには独自の問題が伴います。

私自身、サーバー上にすべての奇妙なものを保持することを好みます。以前は、Web アプリケーションを介して数千通の電子メールを配信し、その進捗状況をユーザーに通知する方法を考え出さなければなりませんでした。キューとして機能する一連のテーブルを設計しました。Web アプリケーションは、配信リクエストをこのキューに配置するだけで、プログレス バーは、キュー内のアイテムのステータスをチェックするリクエストによって決定されます。バックグラウンドで実行されていたのは、このキューもチェックする Windows サービスであり、実際にメールを配信し、完了または失敗した各アイテムのステータスを設定する役割を果たしていました。

Windows サービスは扱いにくいため、開発は少し難しかったですが、一度起動して実行すると、非常にスムーズで信頼性が高くなりました。状況によっては、数分ごとに実行するように設定された単純なスケジュールされたタスクでうまくいくかもしれません。

于 2012-05-29T16:19:59.187 に答える
1

エクスポート用に別のスレッドを明示的に実行することに必ずしも直接ジャンプするとは限りません。これを行うのが理想的ですが、これを行う Web コンテナーの機能が制限要因になります。通常、従来の Java EE アプリ サーバーは、このためにスレッドを生成することを推奨しません (ただし、このためにスレッド プールに接続することはできます)。一部のコンテナーは、作業が完了するまでスレッドをブロックから解放するのに優れているため (たとえば、Jetty と Camel を使用する Karaf)、エクスポートの実行中に他の Web 要求を処理できます。しかし、私の推測では、「エクスポートの開始」スレッドが応答を受信するまでブロックされても問題ないでしょう。

このエクスポートにはどのくらい時間がかかりますか? 数秒ですか、それとも数分近く話していますか? 短い場合は、小さな円形のスピナーが付いた小さな「待機中」アイコンを配置するだけで十分だと思います (お気に入りの Ajax ライブラリを使用します)。

定期的に更新される真のステータスバーが本当に必要な場合は、ある程度の頻度でポーリングする必要があります。おそらく、それは、そのジョブ ID のデータベース テーブルからジョブの進行状況をロードする単純な要求である可能性があります。

于 2012-05-29T16:26:31.337 に答える
0

インラインで答えを見つける

私は正しいアプローチに従っていますか?Web アプリケーションでマルチスレッドを使用する際に問題はありますか?

-はい、あなたは正しい道を進んでいます。いいえ、Web アプリケーションのマルチスレッドにはそのような問題はなく、WinForm で行うのと同じくらい簡単です。Dispatcher を使用して UI を更新する代わりに、AJAX 呼び出しを行い、javascript で DOM 操作を行います。

エクスポート プロセス中に F5 キーまたは更新ボタンを押すと、正確には何が起こりますか? プロセスを停止するにはどうすればよいですか?

- 残念ながら、簡単な方法はありません。標準的な方法は、この種の処理が完了し、ユーザーが F5 キーを押したときに、(javascript を使用して) ダイアログを表示し、ジョブがまだ実行中であることをユーザーに通知することです。ユーザーがまだリフレッシュしたい場合は、タスクをキャンセルするためにサーバーに別のリクエストを行う必要があります (タスクをキャンセルする場所にスレッド ID またはキャンセル トークンを保存する必要があります)。

プログレスバーを定期的に更新するにはどうすればよいですか? サーバーへの ajax 経由で呼び出しを行う必要がありますか?

-標準的な方法は、通常、読み込み中の画像を表示することです。状況依存のプログレス バーを表示したい場合は、ポーリングを行う必要があります。これは Dino Espito による例です。ASP.NET ではありますが、基礎となる原則 Dino Espitoを理解できます。

于 2012-05-29T16:20:26.727 に答える