2015-01-06 6 views

Antwort

20

Vereinfachung Beispiel in Das Buch der Vaadin

Die Book Of Vaadin enthält ein Kapitel über Push einschließlich am Beispiel Vaadin Charts.

Unten ist mein Code. Auf der Grundlage des oben erwähnten Vaadin Charts-Beispiels habe ich es vereinfacht, indem ich die Verwendung eines Chart Objekts durch ein einfaches Label Objekt ersetzt habe. Das Label wird jede Sekunde aktualisiert, um Ihnen die aktuelle Uhrzeit mitzuteilen.

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

Für Beispiel Use Only -

Caveat ein Exekutor in Projekt der realen Welt Verwendung: unten Mein Beispiel für Einfachheit gebaut wird, nicht als Produktionscode bestimmt. Einen Thread zu schlafen ist eine grobe und unbeholfene Art, geplante Threads zu verwalten. Java bietet die Executor Einrichtung für diese Art von Arbeit. In einem realen Projekt würde ich einen ScheduledExecutorService statt eines einzelnen schlafenden Thread Objekts verwenden, um unsere Aufgabe zu planen (Zeit zu erzählen). Verwandter Tipp: Verwenden Sie niemals Timer in einer Servlet-Umgebung. Für ein vollständigeres und realistischeres Beispiel siehe my Answer zu einer ähnlichen Frage zu Push mit Vaadin.

Ich nahm andere Verknüpfungen in diesem Beispiel, wie zum Beispiel: Ich stelle das Label Widget direkt auf den UI während der realen Welt der Arbeit ein Layout die Label enthält verwenden würde.

Meine Konfiguration

Mein Code verwendet Vaadin 7.3.7 mit Java 8-Update 25 in NetBeans 8.0.2 und Tomcat 8.0.15 auf Mac OS X 10.8.5 (Mountain Lion).

Push-Technologie ist relativ neu, vor allem die WebSocket Sorte. Achten Sie darauf, den aktuellen Versionen des Webservers, wie letzten Aktualisierungen zu Tomcat 7 oder 8.

Verwendung Verwendung Verwendung dieses Beispiels

Dieser Code eine einzelne Datei ist, die MyUI.java Datei. So verwenden Sie diesen Code:

  1. Erstellen Sie eine neue Standard-Vaadin-App in Ihrer IDE der Wahl.
  2. Lassen Sie das Beispiel erfolgreich ausgeführt werden, bevor Sie es ändern.
  3. Ersetzen Sie den Inhalt der MyUI Klasse durch den folgenden Code.

@Push Annotation

Neben dem Code in der Mitte, beachten Sie, wie wir die @Push Anmerkung zum MyUI Klassendefinition hinzugefügt.

Beispielcode

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

ist das Widgetset erforderlich? ich schätze: nein. auch warum sich mit java.time beschäftigen (und für einen ganzen Absatz erklären), wenn es das Ziel ist, ein minimales Arbeitsbeispiel zu haben? Verwenden Sie einfach einen Zähler oder 'new Date(). toString()'. und in Ihrer Frage geben Sie an, dass Sie eine einfache Test-App haben wollten, wo Sie dieses Zeug testen können. Warum also nicht Ihr ** ganzes Projekt ** (einschließlich Ihres Pom/grddle/yourname) auf github für die SO-Benutzer, die Ihre Frage finden? – cfrick

+0

@cfrick Alle guten Punkte; Vielen Dank. [A] Ich habe den java.time-Gebrauch und die Diskussion, wie du es vorgeschlagen hast, beendet. [B] Was das Widgetset betrifft, ist diese Annotation der Standard in dem neuen Multi-Modul-Projekt, das von [dem neuen Maven-Archetyp] (https://vaadin.com/blog/-/blogs/vaadin-7-3-7) erstellt wurde -and-new-maven-archetypes), wie es das Update 1.1.3 zum [Vaadin Plugin für NetBeans] (http://plugins.netbeans.org/plugin/50531/vaadin-plug-in-for-netbeans) liefert). Außerdem bedeutet das vage doc, dass das Widgetset (und das Theme) nun automatisch in der Kompilation des "production" Moduls optimiert wird. Also werde ich das an Ort und Stelle lassen. –

1

Here ist ein einfacher, aber voll Vaadin 8 Beispiel, das zeigt, wie Server-Push verwenden und Java EE-Messaging-APIs Nachrichten zwischen verschiedenen UIs zu senden, um die Broadcaster pattern in Vaadin docs beschrieben ist. Wenn Sie nicht daran interessiert sind, Nachrichten zu senden oder an andere Benutzer zu senden, dann schauen Sie sich nur an.

Prinzipiell es läuft alles auf die folgenden:

  1. Beschriften der Vaadin UI mit @Push Server-Push aktivieren (standardmäßig über eine WebSocket-Verbindung)
  2. Wrap UI-Updates mit access(), wenn es den Zugriff auf von anderen Threads, die standardmäßig geschieht automatisch Updates zu senden:

    getUI().access(() -> layout.addComponent(new Label("Hello!"))); 
    
  3. Verwenden Sie die Broadcaster pattern um Nachrichten an andere Benutzer zu veröffentlichen und ihre Nachrichten zu abonnieren.

+0

Mit "Broadcaster Pattern" meinen Sie das [* Observer * -Muster] (https://en.wikipedia.org/wiki/Observer_pattern) oder etwas anderes? –

+1

Etwas anderes, ich meine das [Broadcaster Muster] (https://github.com/vaadin/framework/blob/master/documentation/advanced/advanced-push.asciidoc#the-broadcaster) dokumentiert in Vaadin docs. – mrts