2013-12-04 23 views
6

現在、私はJax Rsアプリケーションに取り組んでおり、Base64でエンコードされた画像をクライアントに出力したいと考えています。クライアントはモバイルデバイスです。Java FXを使用してサーバー側で画像を生成する

モバイルデバイスはいくつかのパラメータでこのサービスを呼び出し、サーバーは棒グラフを描き、それをbase64でエンコードされたイメージ文字列としてデバイスに返送する必要があります。

必要なチャートライブラリを持つjava Fx以降、私は次のチュートリアルを使用してサンプルを作成しました。 「スナップショット」機能も正常に機能していた(画面のイメージを作成する)。

http://docs.oracle.com/javafx/2/charts/bar-chart.htm#CIHJFHDE

は今、私はジャックスルピーアプリケーション内でこれに必要があるため、Applicationクラスを拡張せずにこれをやりたいです。だから、私は単にBuffredImageを作成するためにAPIを使用して、それをBase64ストリングの作成に使用することができます。

JFreeChartを使用してこれを行う方法が見つかりました。しかし、私がJava FXを使ってこれを行うことができるのであれば、私は好きです。私は

アドバイスをくださいのJava Fxの持つ任意の以前の経験を持っていない

答えて

8

サーバーベースのJavaFXランタイムの初期化

サーバー上のJavaFXを実行するには必要のいずれかに:

  1. 起動A JavaFX Applicationまたは
  2. JFXPanelを使用してください。

これは、JavaFX 2で初期化されたJavaFXランタイムシステムを使用できるようにするための唯一の方法です。

JFXPanelを使用すると、JavaFXアプリケーションを使用するよりも、多少処理効率が低下する可能性があります。

さらに、StackOverflow質問のJavaFXシステムの初期化については、JavaFX 2.1: Toolkit not initializedを参照してください。

JavaFXのは、あなたが任意のスレッドでほとんどのJavaFXコンポーネントを作成することができます

シングルスレッドのシステムです。ただし、シーン内でコンポーネントをレンダリングするには、JavaFXアプリケーションスレッドで作業を実行する必要があります。つまり、ほとんどのサーバーがあり、複数のグラフを生成するマルチスレッドサーバープロセスがある場合、並行処理の制約を使用してチャートのレンダリング要求をシングルスレッド化する必要があります。

  1. チャートの受信リクエストを受け取ったら、Platform.runLaterコマンドを発行します。 runLaterブロック内のすべてのコードは、最終的にJavaFXアプリケーションスレッドで実行されるキューに配置されます。
  2. runLaterブロックで、グラフのシーンを作成し、それを画像にスナップショットします。 callback version of snapshotは、JavaFXアプリケーションスレッドをそれほど縛らない可能性があるため、ここで使用するのに最も適しているかもしれませんが、使用するのは面倒です。
  3. SwingFXUtils.fromFXImageを使用してJavaFXイメージをAWTイメージに変換します。
  4. サーバハンドラスレッドでイメージ結果を返すには、Return result from javafx platform runlaterのsarcanで概説されたFutureTaskテクニックを使用してください。

サーバーハンドラスレッドは、ImageIOを使用して、AWTイメージをpngのような形式の出力ストリームに変換できます。結果ストリームとBase64 encode itを取得し、元の画像要求呼び出しに応答して、サーバーが64の符号化ストリームを返すようにすることができます。

正常なシャットダウンを確認し

あなたはまた、シャットダウンにPlatform.exit()を呼び出すように、サーバーの起動時にPlatform.setImplicitExit(false)を起動し、シャットダウンフックまたはサーブレットが破壊されているときに監視ServletContextListenerを登録したいと思うでしょうJavaFXシステム。これを行わないと、JavaFXアプリケーションスレッドが実行待ちの作業を継続して実行するため、サーバをきれいにシャットダウンできなくなる可能性があります。

のJavaFX 2.2は本当に

Swingアプリケーションがrun in headless modeシステムプロパティjava.awt.headlessを使用することができますヘッドレスサーバ上での動作が保証されていません。私はJavaFXの同様のプロパティを認識していませんが、もしある場合は、openjfx-dev mailing listを調べることによって、それが何であるかを知ることができます。

JavaFXは、主にクライアントグラフィックスツールキットとして設計されています。サーバ上でアプリケーションを動作させて正常に動作させるには、サーバをheadless serverとして設定しないでください。また、適切なグラフィックアクセラレータカードを使用して、負荷がかかった状態で適切なパフォーマンスを発揮できるようにする必要があります。

JavaFX issue trackerでは、ヘッドレスモードの正式サポートのリクエストを行うことができます。

+0

私はJFXPanelが私の問題を解決すると思います。しかし、私はそれがサーバー側から新しいスレッドを開始し、Java FXロジックを実行する方が良いと思います。ありがとうございます.. –

+0

追加の実装アドバイスを提供するために私の答えを編集しました。 – jewelsea

+0

JFXPanelを使ってこれを実装しようとしたときに、私はこれらの質問もすべて持っていました。特にスレッド処理。ヘッドレスサーバーの問題については、http://stackoverflow.com/questions/17940329/javafx-for-server-side-image-generation thisに関する回答が見つかりました。しかし、私はまだそれを試していない。そのような詳細な答えをありがとう –

関連する問題