2013-12-04 14 views
6

Attualmente sto lavorando all'applicazione Jax Rs e voglio inviare l'immagine codificata Base64 al client. Il client è un dispositivo mobile.Generazione di immagini sul lato server utilizzando Java FX

Il dispositivo mobile chiamerà questo servizio con alcuni parametri e il server deve disegnare un grafico a barre e inviarlo al dispositivo come una stringa di immagine codificata base64.

Poiché java Fx dispone delle librerie di grafici richieste, ho eseguito un esempio utilizzando il seguente tutorial. la funzione "snapshot" ha funzionato correttamente come previsto (per creare un'immagine dello schermo).

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

Ora io voglio fare questo senza estendere Classe di applicazione perché ho bisogno di questo all'interno dell'applicazione Jax Rs. In modo che io possa semplicemente usare api per creare una BuffredImage e quindi usarla per creare una stringa Base64.

Ho trovato un modo per farlo usando JFreeChart. Ma preferisco se posso farlo usando Java FX. Io non avere alcuna precedente esperienza con Java Fx

Si prega di consulenza

risposta

8

Server basato JavaFX runtime inizializzazione

Per eseguire JavaFX sul server è necessario uno:

  1. Avviare un JavaFX Application O
  2. Utilizzare uno JFXPanel.

Questi sono gli unici modi per inizializzare il sistema di runtime JavaFX in JavaFX 2 in modo da poterlo utilizzare.

L'utilizzo di un JFXPanel è probabilmente un processo leggermente meno efficiente rispetto all'utilizzo di un'applicazione JavaFX.

C'è un'ulteriore discussione sull'inizializzazione del sistema JavaFX nella domanda StackOverflow: JavaFX 2.1: Toolkit not initialized.

JavaFX è un singolo sistema filettato

È possibile creare maggior parte dei componenti JavaFX in qualsiasi thread. Tuttavia, per eseguire il rendering dei componenti in una scena, è necessario eseguire il lavoro sul thread dell'applicazione JavaFX. Ciò significa che se si dispone di un processo del server multi-thread, che è la maggior parte dei server e si desidera generare più grafici, sarà necessario eseguire il thread singolo delle richieste di rendering del grafico utilizzando i vincoli di concorrenza.

  1. Quando si riceve una richiesta in arrivo per un grafico, emettere un comando Platform.runLater. Tutto il codice nel blocco runLater verrà inserito in una coda che verrà eseguita sul thread dell'applicazione JavaFX.
  2. Nel blocco runLater crea una scena per il grafico e lo snapshot su un'immagine. Il callback version of snapshot potrebbe essere il più appropriato da usare qui poichè probabilmente non lega tanto il thread JavaFX Application, anche se è più facile da usare.
  3. Convertire l'immagine JavaFX in un'immagine AWT utilizzando SwingFXUtils.fromFXImage.
  4. Per ottenere il risultato immagine indietro nel tuo thread gestore del server, utilizzare la tecnica FutureTask delineato da sarcan in: Return result from javafx platform runlater.

Il thread del gestore server può quindi utilizzare ImageIO per convertire l'immagine AWT in un flusso di output in un formato come png. È possibile prendere il flusso dei risultati e Base64 encode it e fare in modo che il server restituisca lo stream codificato di base 64 in risposta alla chiamata di richiesta di immagine originale.

Garantire arresto regolare

Si vuole richiamare Platform.setImplicitExit(false) quando il server si avvia e registrare un gancio di arresto o un ServletContextListener che controlla quando il servlet viene distrutto, in modo che anche voi richiama Platform.exit() per spegnere il Sistema JavaFX. Se non lo fai, probabilmente il tuo server non sarà in grado di spegnersi in modo pulito perché il thread dell'applicazione JavaFX continuerà a essere in attesa di lavoro.

JavaFX 2.2 non è in realtà certificata per l'esecuzione su un server senza testa

applicazioni Swing può run in headless mode utilizzando una proprietà di sistema java.awt.headless. Non sono a conoscenza di una proprietà simile per JavaFX, se ci possono uno e, se ci fosse, si potrebbe scoprire che cosa era chiedendo al openjfx-dev mailing list.

JavaFX è stato progettato principalmente come un set di strumenti grafici client. Mentre si potrebbe farlo funzionare e funzionare in modo soddisfacente per l'applicazione su un server, per farlo, potrebbe essere necessario per assicurare che il server non è configurato come un headless server e che ha un adeguato scheda acceleratrice grafica per fornire prestazioni ragionevoli sotto carico .

È possibile presentare una richiesta di supporto ufficiale di un modo senza testa nel JavaFX issue tracker.

+0

Penso JFXPanel risolverà il mio problema. Ma penso che sia meglio iniziare una nuova discussione dal lato server ed eseguire la logica Java FX. Grazie .. –

+0

Ho modificato la mia risposta per fornire ulteriori consigli sull'implementazione. – jewelsea

+0

Ho anche avuto tutte queste domande quando ho provato a implementarlo usando JFXPanel. Speciale gestione del filo. Per il problema del server headless ho trovato una risposta su http://stackoverflow.com/questions/17940329/javafx-for-server-side-image-generation. Ma non l'ho ancora provato. Grazie per una risposta così dettagliata –

Problemi correlati