java - Ejemplo mínimo de la aplicación Push in Vaadin 7("@Push")
vaadin7 web-push (2)
Simplificación de ejemplo en el libro de Vaadin
El Libro de Vaadin incluye un capítulo sobre Push, que incluye un ejemplo con Gráficos de Vaadin .
Abajo está mi código.
Si bien me basé en el ejemplo de Vaadin Charts mencionado anteriormente, lo simplifiqué reemplazando el uso de un objeto
Chart
con un simple objeto
Label
.
La etiqueta se actualiza cada segundo más o menos para decirle la hora actual.
Solo para uso de ejemplo: use un ejecutor en un proyecto del mundo real
Advertencia:
mi ejemplo a continuación está diseñado para simplificar,
no pretende ser un código de producción
.
Dormir un hilo es una forma cruda e incómoda de administrar el trabajo programado de subprocesos.
Java proporciona la instalación de
Executor
para este tipo de trabajo.
En un proyecto del mundo real, usaría un
ScheduledExecutorService
lugar de un solo objeto
Thread
dormido para programar nuestra tarea (de decir la hora).
Consejo relacionado: nunca use un
Timer
en un entorno Servlet.
Para un ejemplo más completo y más real, vea
mi respuesta
a una pregunta similar sobre Push with Vaadin.
Tomé otros accesos directos en este ejemplo, tales como:
Label
widget de
Label
directamente en la
UI
mientras que el trabajo del mundo real usaría un
Layout
para contener la
Label
.
Mi configuracion
Mi código está usando Vaadin 7.3.7 con Java 8 Update 25 en NetBeans 8.0.2 y Tomcat 8.0.15 en Mac OS X 10.8.5 (Mountain Lion).
La tecnología push es relativamente nueva, especialmente la variedad WebSocket . Asegúrese de utilizar versiones recientes de su servidor web, como actualizaciones recientes de Tomcat 7 u 8.
Cómo usar este ejemplo
Este código es un archivo único, el archivo
MyUI.java
.
Para usar este código:
- Cree una nueva aplicación Vaadin predeterminada en su IDE de elección.
- Haga que ese ejemplo se ejecute correctamente antes de modificarlo.
-
Reemplace el contenido de la clase
MyUI
con el siguiente código.
Anotación
@Push
Al lado del código en el medio, observe cómo agregamos la anotación
@Push
a la definición de clase
MyUI
.
Código de ejemplo
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();
}
}
}
}
Quiero ver el ejemplo más mínimo de uso de la nueva
tecnología Push
en Vaadin 7, como la nueva anotación
@Push
.
Tengo problemas para que server-push funcione en mi aplicación. Me gustaría probar una aplicación de ejemplo simple antes de intentar arreglar mi propia aplicación.
Here hay un ejemplo simple pero completo de Vaadin 8 que demuestra cómo usar las API de mensajería push de servidor y Java EE para enviar mensajes entre diferentes IU utilizando el patrón Broadcaster descrito en los documentos de Vaadin . Si no está interesado en ReceiveMessageUI mensajes o retransmitir a otros usuarios, mire solo ReceiveMessageUI .
En principio, todo se reduce a lo siguiente:
-
Anote la interfaz de usuario de Vaadin con
@Push
para habilitar la inserción del servidor (de forma predeterminada a través de una conexión WebSocket) -
Envuelva las actualizaciones de la interfaz de usuario con
access()
al acceder desde otros subprocesos, el envío de actualizaciones se realiza automáticamente de forma predeterminada:getUI().access(() -> layout.addComponent(new Label("Hello!")));
-
Use el patrón Broadcaster para publicar mensajes a otros usuarios y suscribirse a sus mensajes.