web-dev-qa-db-ja.com

Vaadin 7アプリのプッシュの最小限の例( "@Push")

新しい@Pushアノテーションなど、Vaadin 7で新しい プッシュテクノロジー を使用する最小限の例を見たいと思います。

server-Push をアプリで動作させるのに問題があります。自分のアプリを修正する前に、簡単なサンプルアプリを試してみたいと思います。

15
Basil Bourque

The Book Of Vaadinの例の簡略化

Book Of Vaadin には、 Vaadin Charts を使用した例を含む、プッシュに関する章が含まれています。

以下は私のコードです。上記のVaadinChartsの例に基づいて、 Chart オブジェクトの使用を単純な Label オブジェクトに置き換えることで簡略化しました。 。ラベルは1秒ごとに更新され、現在の時刻が示されます。

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

使用例のみ–実際のプロジェクトでエグゼキュータを使用する

警告:以下の例は簡単にするために作成されています、本番コードとして意図されていません。スレッドのスリープは、スケジュールされたスレッド化された作業を管理するための粗雑で厄介な方法です。 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ファイル。このコードを使用するには:

  1. 選択したIDE)に新しいデフォルトのVaadinアプリを作成します。
  2. 変更する前に、その例を正常に実行してください。
  3. MyUIクラスの内容を以下のコードに置き換えます。

@Push注釈

真ん中のコードの横に、 @PushMyUIクラス定義への注釈。

サンプルコード

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

ここ はシンプルですが完全なVaadin 8の例で、サーバープッシュとJava EEメッセージングAPIを使用して、 Broadcasterpattern 説明 Vaadin docs 。他のユーザーへのメッセージングやブロードキャストに興味がない場合は、 ReceiveMessageUI のみ。

原則として、それはすべて次のように要約されます。

  1. Vaadin UIに_@Push_で注釈を付けて、サーバープッシュを有効にします(デフォルトではWebSocket接続を介して)
  2. UIの更新を他のスレッドからアクセスするときにaccess()でラップすると、更新の送信はデフォルトで自動的に行われます。

    _getUI().access(() -> layout.addComponent(new Label("Hello!")));
    _
  3. Broadcasterpattern を使用して、他のユーザーにメッセージを公開し、そのメッセージをサブスクライブします。

1
mrts