Минимальный пример приложения Push in Vaadin 7 ("@Push")

Я хочу увидеть самый минимальный пример использования новой технологии Push в Vaadin 7, такой как новый @Push аннотаций.

У меня проблемы с получением принудительной работы сервера в моем приложении. Я хотел бы попробовать простой пример приложения, прежде чем пытаться исправить свое собственное приложение.

2 ответа

Решение

Упрощение примера в книге Ваадина

Книга Ваадина включает главу о толчке, в том числе пример с использованием диаграмм Ваадина.

Ниже мой код. Основываясь на упомянутом выше примере с диаграммами Ваадина, я упростил его, заменив использование Chart объект с простым Label объект. Метка обновляется каждую секунду или около того, чтобы сообщить вам текущее время.

снимок экрана примера приложения Vaadin, показывающего текущее время в UTC в виде текста

Только для примера. Используйте исполнителя в реальном проекте.

Предостережение: мой пример ниже построен для простоты, а не для производственного кода. Спящий поток - это грубый и неловкий способ управления запланированной многопоточной работой. Java предоставляет Executor средство для такого рода работы. В реальном проекте я бы использовал ScheduledExecutorService, а не один спящий Thread объект, чтобы наметить нашу задачу (о времени показа). Связанный совет: никогда не используйте Timer в среде сервлетов. Для более полного и реального примера, см. Мой ответ на похожий вопрос о толчке с Ваадином.

В этом примере я взял другие ярлыки, такие как: Label виджет прямо на UI в то время как реальная работа будет использовать Layout содержать Label,

Моя конфигурация

Мой код использует Vaadin 7.3.7 с Java 8 Update 25 в NetBeans 8.0.2 и Tomcat 8.0.15 в Mac OS X 10.8.5 (Mountain Lion).

Технология Push является относительно новой, особенно разновидностью WebSocket. Обязательно используйте последние версии вашего веб-сервера, такие как последние обновления Tomcat 7 или 8.

Как использовать этот пример

Этот код представляет собой один файл, MyUI.java файл. Чтобы использовать этот код:

  1. Создайте новое приложение Vaadin по умолчанию в выбранной вами IDE.
  2. Успешно запустите этот пример перед изменением.
  3. Заменить содержимое MyUI класс с кодом ниже.

@Push аннотирование

Рядом с кодом в середине обратите внимание, как мы добавили @Push аннотация к MyUI определение класса.

Пример кода

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();
            }
        }
    }
}

Вот простой, но полный пример Vaadin 8, который демонстрирует, как использовать серверные push-интерфейсы и API-интерфейсы обмена сообщениями Java EE для отправки сообщений между различными пользовательскими интерфейсами с использованием шаблона Broadcaster, описанного в документах Vaadin. Если вы не заинтересованы в обмене сообщениями или рассылке другим пользователям, обратите внимание только на ReceiveMessageUI.

В принципе все сводится к следующему:

  1. Аннотировать пользовательский интерфейс Vaadin с помощью @Push включить принудительную передачу сервера (по умолчанию через соединение WebSocket)
  2. Wrap обновления пользовательского интерфейса с access() при доступе к нему из других потоков отправка обновлений происходит автоматически по умолчанию:

    getUI().access(() -> layout.addComponent(new Label("Hello!")));
    
  3. Используйте шаблон Broadcaster для публикации сообщений другим пользователям и подписки на их сообщения.

Другие вопросы по тегам