新しい@Push
アノテーションなど、Vaadin 7で新しい プッシュテクノロジー を使用する最小限の例を見たいと思います。
server-Push をアプリで動作させるのに問題があります。自分のアプリを修正する前に、簡単なサンプルアプリを試してみたいと思います。
Book Of Vaadin には、 Vaadin Charts を使用した例を含む、プッシュに関する章が含まれています。
以下は私のコードです。上記のVaadinChartsの例に基づいて、 Chart
オブジェクトの使用を単純な Label
オブジェクトに置き換えることで簡略化しました。 。ラベルは1秒ごとに更新され、現在の時刻が示されます。
警告:以下の例は簡単にするために作成されています、本番コードとして意図されていません。スレッドのスリープは、スケジュールされたスレッド化された作業を管理するための粗雑で厄介な方法です。 Javaはこの種の作業にExecutor
機能を提供します。実際のプロジェクトでは、単一のスリープではなく ScheduledExecutorService を使用します- Thread
(時間を伝える)タスクをスケジュールするオブジェクト。関連するヒント:サーブレット環境ではTimer
を使用しないでください。より完全で実際的な例については、を参照してください。 私の回答 Vaadinを使用したプッシュに関する同様の質問へ。
この例では、次のような他のショートカットを使用しました。Label
ウィジェットをUI
に直接配置しますが、実際の作業ではLayout
を使用してLabel
。
私のコードは、Vaadin7.3.7とJava 8 Update 25 in NetBeans8.0.2およびTomcat8.0.15 on Mac OS X 10.8.5(Mountain Lion))を使用しています。
プッシュテクノロジーは比較的新しく、特に WebSocket の種類です。 Tomcat 7または8の最近の更新など、Webサーバーの最新バージョンを使用してください。
このコードは単一のファイル、MyUI.Java
ファイル。このコードを使用するには:
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の例で、サーバープッシュとJava EEメッセージングAPIを使用して、 Broadcasterpattern 説明 Vaadin docs 。他のユーザーへのメッセージングやブロードキャストに興味がない場合は、 ReceiveMessageUI のみ。
原則として、それはすべて次のように要約されます。
@Push
_で注釈を付けて、サーバープッシュを有効にします(デフォルトではWebSocket接続を介して)UIの更新を他のスレッドからアクセスするときにaccess()
でラップすると、更新の送信はデフォルトで自動的に行われます。
_getUI().access(() -> layout.addComponent(new Label("Hello!")));
_
Broadcasterpattern を使用して、他のユーザーにメッセージを公開し、そのメッセージをサブスクライブします。