Générer une image côté serveur à l'aide de Java FX


Actuellement, je travaille sur l'application Jax Rs et je veux sortir une image encodée en Base64 vers le client. Le client est un appareil mobile.

L'appareil mobile appellera ce service avec certains paramètres et le serveur doit dessiner un graphique à barres et le renvoyer à l'appareil sous la forme d'une chaîne d'image codée en base64.

Puisque java Fx a les bibliothèques de graphiques requises, j'ai fait un exemple en utilisant le tutoriel suivant. La fonction" snapshot " a également fonctionné correctement comme prévu (pour créer une image de écran).

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

Maintenant, je veux le faire sans étendre la classe d'application car j'en ai besoin dans l'application Jax Rs. Pour que je puisse simplement utiliser l'API pour créer un BuffredImage, puis l'utiliser pour créer une chaîne Base64.

J'ai trouvé un moyen de le faire en utilisant JFreeChart. Mais je préfère si je peux le faire en utilisant Java FX. Je n'ai aucune expérience antérieure avec Java Fx

S'il vous plaît conseil

Author: Chanaka Perera, 2013-12-04

1 answers

Initialisation du runtime JavaFX basé sur le serveur

Pour exécuter JavaFX sur un serveur, vous devez soit:

  1. Lancer une application JavaFX OU
  2. Utilisez un JFXPanel.

Ce sont les seuls moyens d'initialiser le système d'exécution JavaFX dans JavaFX 2 afin que vous puissiez l'utiliser.

L'utilisation d'un JFXPanel est probablement un traitement légèrement moins efficace que l'utilisation d'une application JavaFX.

Il y a d'autres discussions sur initialisation du système JavaFX dans la question StackOverflow: JavaFX 2.1: Boîte à outils non initialisée .

JavaFX est un système à thread unique

Vous pouvez créer la plupart des composants JavaFX dans n'importe quel thread. Cependant, pour rendre les composants dans une scène, vous devez effectuer le travail sur le thread d'application JavaFX. Cela signifie que si vous avez un processus serveur multithread, ce que sont la plupart des serveurs, et que vous souhaitez générer plusieurs graphiques, vous aurez besoin d'un seul thread le graphique rend les demandes à l'aide de contraintes de concurrence.

  1. Lorsque vous recevez une demande entrante pour un graphique, émettez une plate-forme .Commande runLater . Tout le code du bloc runLater sera placé dans une file d'attente qui s'exécutera éventuellement sur le thread d'application JavaFX.
  2. Dans le bloc runLater, créez une scène pour votre graphique et capturez-la dans une image. La version de rappel de snapshot {[9] } pourrait être la plus appropriée à utiliser ici car elle ne lie probablement pas up le thread d'application JavaFX autant, bien qu'il soit probablement plus difficile à utiliser.
  3. Convertissez l'image JavaFX en une image AWT en utilisant SwingFXUtils.fromFXImage .
  4. Pour récupérer votre résultat d'image dans votre thread de gestionnaire de serveur, utilisez la technique FutureTaskdécrite par sarcan dans: Return result from javafx platform runlater.

Votre thread de gestionnaire de serveur peut ensuite utiliser ImageIO pour convertir l'image AWT en un flux de sortie dans un format comme png. Vous pouvez prendre le flux de résultats et l'encoder Base64 et demander au serveur de renvoyer le flux codé en base 64 en réponse à l'appel de demande d'image d'origine.

Assurer l'arrêt gracieux

Vous voudrez appeler la plate-forme .setImplicitExit (false) lorsque votre serveur démarre et enregistre un hook d'arrêt ou un ServletContextListener qui surveille lorsque le servlet est détruit, de sorte que vous invoquez également Plateforme.exit () pour arrêter le système JavaFX. Si vous ne le faites pas, votre serveur ne pourra probablement pas s'arrêter proprement car le thread d'application JavaFX continuera à s'exécuter en attendant le travail à faire.

JavaFX 2.2 n'est pas vraiment certifié pour fonctionner sur un serveur sans tête

Les applications Swing peuvents'exécuter en mode sans tête en utilisant une propriété système java.awt.sans tête . Je ne suis pas au courant d'une propriété similaire pour JavaFX, bien qu'il puisse y en avoir une et, si il y avait, vous pourriez découvrir ce que c'était en demandant la liste de diffusion openjfx-dev.

JavaFX est principalement conçu comme une boîte à outils graphique client. Bien que vous puissiez le faire fonctionner et fonctionner de manière satisfaisante pour votre application sur un serveur, pour ce faire, vous devrez peut-être vous assurer que le serveur n'est pas configuré en tant que serveur sans tête et qu'il dispose d'une carte d'accélérateur graphique appropriée pour fournir des performances raisonnables sous charge.

Vous pouvez déposer une demande officielle prise en charge d'un mode sans tête dans le JavaFX issue tracker.

 8
Author: jewelsea, 2017-05-23 12:10:41