Минимальный пример приложения Push in Vaadin 7 ("@Push")
Я хочу увидеть самый минимальный пример использования новой технологии Push в Vaadin 7, такой как новый @Push
аннотаций.
У меня проблемы с получением принудительной работы сервера в моем приложении. Я хотел бы попробовать простой пример приложения, прежде чем пытаться исправить свое собственное приложение.
2 ответа
Упрощение примера в книге Ваадина
Книга Ваадина включает главу о толчке, в том числе пример с использованием диаграмм Ваадина.
Ниже мой код. Основываясь на упомянутом выше примере с диаграммами Ваадина, я упростил его, заменив использование Chart
объект с простым Label
объект. Метка обновляется каждую секунду или около того, чтобы сообщить вам текущее время.
Только для примера. Используйте исполнителя в реальном проекте.
Предостережение: мой пример ниже построен для простоты, а не для производственного кода. Спящий поток - это грубый и неловкий способ управления запланированной многопоточной работой. 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
файл. Чтобы использовать этот код:
- Создайте новое приложение Vaadin по умолчанию в выбранной вами IDE.
- Успешно запустите этот пример перед изменением.
- Заменить содержимое
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.
В принципе все сводится к следующему:
- Аннотировать пользовательский интерфейс Vaadin с помощью
@Push
включить принудительную передачу сервера (по умолчанию через соединение WebSocket) Wrap обновления пользовательского интерфейса с
access()
при доступе к нему из других потоков отправка обновлений происходит автоматически по умолчанию:getUI().access(() -> layout.addComponent(new Label("Hello!")));
Используйте шаблон Broadcaster для публикации сообщений другим пользователям и подписки на их сообщения.