2015-01-06 13 views

答えて

20

Vaadinの予約実施例の簡略化

Book Of VaadinVaadin Chartsを用いた例を含むプッシュの章を含みます。

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

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

のみ - 現実世界のプロジェクトでエグゼキュータを使用し

警告:下の私の例では、は、生産コードとして意図していない、簡単にするために構築されています。スレッドをスリープさせることは、スケジュールされたスレッド化された作業を管理するための粗雑で厄介な方法です。 Javaでは、この種の作業にはExecutor機能が用意されています。現実世界のプロジェクトでは、私たちの仕事(時間を知らせる)をスケジュールするために、単一の睡眠のThreadオブジェクトではなく、ScheduledExecutorServiceを使用します。関連するヒント:サーブレット環境ではTimerを使用しないでください。より完全でより現実的な例については、VaadinによるPushに関する同様の質問に対するmy Answerを参照してください。

私のようなこの例では他のショートカットを、取った:実世界の仕事はLabelを含むようにLayoutを使用するのに対し、私はUIに直接Labelウィジェットを配置します。

マイコンフィギュ

私のコードは、NetBeans 8.0.2およびMac OS X 10.8.5上のTomcat 8.0.15(マウンテンライオン)でJava 8のアップデート25でVaadin 7.3.7を使用しています。

プッシュ技術は比較的新しく、特にWebSocketです。そのようなこの例のコードは、1つのファイルをある

MyUI.javaファイルを使用する方法最近のTomcat 7への更新または8

としてWebサーバ、最近のバージョンを使用してください。このコードを使用するには:

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

@Push注釈

真ん中のコードに加えて、我々はMyUIクラス定義に@Push注釈を追加する方法に注意してください。

サンプルコード

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

はウィジェットセットが必要ですか?私の推測:いいえ。また、目的が最小限の実例を持つことになっている場合にはどうしたらよいでしょうか?カウンタや 'new Date()。toString()'だけを使用してください。あなたの質問では、あなたはこのようなものをテストできる簡単なテストアプリを持っていたいと述べています。だからあなたの質問を見つけるSOユーザのために**あなたの**プロジェクト全体**(あなたのpom/gradle/younameitを含む)をgithubに入れてみませんか? – cfrick

+0

@cfrick良い点;ありがとうございました。 [A]あなたが示唆したように、私はjava.timeの使用と議論を殺しました。 [B]ウィジェットセットに関しては、[新しいMavenアーキタイプ](https://vaadin.com/blog/-/blogs/vaadin-7-3-7)によって作成された新しいマルチモジュールプロジェクトでは、そのアノテーションがデフォルトです「Vaadin Plugin For NetBeans」1.1.3アップデート(http://plugins.netbeans.org/plugin/50531/vaadin-plug-in-for-netbeans)で提供されています。 )。さらに、漠然としたドキュメントは、ウィジェットセット(とテーマ)が 'production'モジュールのコンパイルで自動的に最適化されることを意味しています。だから私はその場所に残しておきます。 –

1

HereVaadin docsで説明Broadcaster patternを使用して異なるUIの間でメッセージを送信するためにサーバプッシュとJava EEのメッセージングAPIを使用する方法を示していますシンプルでありながら、フルVaadin 8例です。メッセージングや他のユーザーへのブロードキャストに興味がない場合は、ReceiveMessageUIのみをご覧ください。原則として

それがすべて以下に沸く:

  1. それにアクセスする際access()で(のWebSocket接続を介して、デフォルトでは)サーバプッシュ
  2. ラップUIの更新を可能にするために@PushとVaadin UIに注釈を付けます

    getUI().access(() -> layout.addComponent(new Label("Hello!"))); 
    
  3. がを使用します。他のスレッドから、更新を送信することは、デフォルトでは自動的に行われます他のユーザにメッセージを公開し、メッセージを購読することができる。

+0

"Broadcaster pattern"とは、[*オブザーバー*パターン](https://en.wikipedia.org/wiki/Observer_pattern)などを意味しますか? –

+1

他のものは、Vaadinのドキュメントに記載されている[Broadcasterパターン](https://github.com/vaadin/framework/blob/master/documentation/advanced/advanced-push.asciidoc#the-broadcaster)を意味します。 – mrts

関連する問題