2015-01-06 16 views

risposta

20

semplificazione delle Esempio In The Book Of Vaadin

La Book Of Vaadin comprende un capitolo sulla Push, compreso un esempio di utilizzo Vaadin Charts.

Di seguito è riportato il mio codice. Pur basandosi su quell'esempio di Vaadin Charts menzionato sopra, l'ho semplificato sostituendo l'uso di un oggetto Chart con un semplice oggetto Label. L'etichetta si aggiorna ogni secondo circa per indicare l'ora corrente.

screen shot of example Vaadin app telling current time in UTC as text

Per esempio unico Usa - Utilizzare un esecutore nel progetto del mondo reale

Caveat: Il mio esempio qui sotto è costruito per semplicità, non inteso come codice di produzione. Dormire una discussione è un modo grossolano e scomodo per gestire il lavoro con thread programmato. Java fornisce la funzione Executor per questo tipo di lavoro. In un progetto del mondo reale userei un ScheduledExecutorService piuttosto che un singolo oggetto dormiente Thread per programmare il nostro compito (del tempo di raccontare). Consiglio relativo: non utilizzare mai un valore Timer in un ambiente servlet. Per un esempio più completo e più reale, vedere my Answer a una domanda simile su Push with Vaadin.

ho preso altre scorciatoie in questo esempio, come ad esempio: ho posto il widget Label direttamente sul UI, mentre il lavoro del mondo reale userebbe un Layout per contenere il Label.

La mia configurazione

Il mio codice sta usando Vaadin 7.3.7 con Java 8 Update 25 in NetBeans 8.0.2 e Tomcat 8.0.15 su Mac OS X 10.8.5 (Mountain Lion).

La tecnologia push è relativamente nuova, in particolare la varietà WebSocket. Assicurarsi di utilizzare le versioni più recenti del server web, come gli ultimi aggiornamenti di Tomcat 7 o 8.

Come utilizzare gli esempi

Questo codice è un singolo file, il file MyUI.java. Per utilizzare questo codice:

  1. Creare una nuova app Vaadin predefinita nel proprio IDE preferito.
  2. Ottenere quell'esempio con successo, prima di modificare.
  3. Sostituire il contenuto della classe MyUI con il codice riportato di seguito.

@Push annotazione

accanto al codice in mezzo, si noti come abbiamo aggiunto la @Push annotazioni alla definizione MyUI di classe.

Esempio Codice

package com.example.pushvaadinapp; 

import com.vaadin.annotations.Push; 
import com.vaadin.annotations.Theme; 
import com.vaadin.annotations.VaadinServletConfiguration; 
import com.vaadin.annotations.Widgetset; 
import com.vaadin.server.VaadinRequest; 
import com.vaadin.server.VaadinServlet; 
import com.vaadin.ui.Label; 
import com.vaadin.ui.UI; 
import javax.servlet.annotation.WebServlet; 

/** 
* © 2014 Basil Bourque. This source code may be used freely forever by anyone absolving me of any and all responsibility. 
* 
* +----------------------------+ 
* | NOT FOR PRODUCTION USE! | 
* +----------------------------+ 
*  Sleeping threads is an awkward way to manage scheduled background work. 
*  By the way, never use a 'Timer' in a Servlet environment. 
*  Use an Executor instead, probably a ScheduledExecutorService. 
*/ 
@Push 
@Theme ("mytheme") 
@Widgetset ("com.example.pushvaadinapp.MyAppWidgetset") 
public class MyUI extends UI 
{ 

    Label label = new Label("Now : "); 

    @Override 
    protected void init (VaadinRequest vaadinRequest) 
    { 
     // Put a widget on this UI. In real work we would use a Layout. 
     setContent(this.label); 

     // Start the data feed thread 
     new FeederThread().start(); 
    } 

    @WebServlet (urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true) 
    @VaadinServletConfiguration (ui = MyUI.class , productionMode = false) 
    public static class MyUIServlet extends VaadinServlet 
    { 
    } 

    public void tellTime() 
    { 
     label.setValue("Now : " + new java.util.Date()); // If Java 8, use: Instant.now(). Or, in Joda-Time: DateTime.now(). 
    } 

    class FeederThread extends Thread 
    { 

     int count = 0; 

     @Override 
     public void run() 
     { 
      try { 
       // Update the data for a while 
       while (count < 100) { 
        Thread.sleep(1000); 

        // Calling special 'access' method on UI object, for inter-thread communication. 
        access(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          count ++; 
          tellTime(); 
         } 
        }); 
       } 

       // Inform that we have stopped running 
       // Calling special 'access' method on UI object, for inter-thread communication. 
       access(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         label.setValue("Done."); 
        } 
       }); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+2

è necessario il widgetset? la mia ipotesi: no. anche perché preoccuparsi di (e spiegare per un intero paragrafo) java.time, quando l'obiettivo è avere un minimo esempio di lavoro? basta usare un contatore o 'new Date(). toString()'. e nella tua domanda dichiari che volevi avere una semplice app di test dove poter testare questa roba. quindi perché non inserire il tuo ** intero progetto ** (incluso il tuo pom/gradle/younameit) su github per gli utenti SO, che trovano la tua domanda? – cfrick

+0

@cfrick Tutti i punti positivi; Grazie. [A] Ho ucciso l'uso e la discussione di java.time come suggerito. [B] Come per il widget widgets, quell'annotazione è l'impostazione predefinita nel nuovo progetto multi-modulo creato da [il nuovo archetipo Maven] (https://vaadin.com/blog/-/blogs/vaadin-7-3-7 -e-new-maven-archetypes), come fornito dall'aggiornamento 1.1.3 al [Vaadin Plugin For NetBeans] (http://plugins.netbeans.org/plugin/50531/vaadin-plug-in-for-netbeans). Inoltre, il vago documento implica che widgetset (e theme) ora sia automaticamente ottimizzato nella compilation del modulo 'production'. Quindi lo lascerò sul posto. –

1

Here è un semplice ma completo Vaadin 8 esempio che dimostra come utilizzare server push e le API di messaggistica Java EE per inviare messaggi tra diverse interfacce utente utilizzando il Broadcaster pattern descritto nella Vaadin docs. Se non si è interessati alla messaggistica o alla trasmissione ad altri utenti, consultare solo ReceiveMessageUI.

In linea di principio tutto si riduce al seguente:

  1. Annotate il Vaadin UI con @Push per abilitare server push (di default tramite una connessione WebSocket) aggiornamenti
  2. Wrap UI con access() quando accedervi da altri thread, l'invio di aggiornamenti avviene automaticamente per impostazione predefinita:

    getUI().access(() -> layout.addComponent(new Label("Hello!"))); 
    
  3. Utilizzare il Broadcaster pattern per pubblicare messaggi ad altri utenti e per iscriversi ai loro messaggi.

+0

Per "pattern di Broadcaster" intendi il [* modello Observer * (https://en.wikipedia.org/wiki/Observer_pattern) o qualcos'altro? –

+1

Qualcos'altro, intendo il [pattern Broadcaster] (https://github.com/vaadin/framework/blob/master/documentation/advanced/advanced-push.asciidoc#the-broadcaster) documentato in documenti Vaadin. – mrts