0

ユースケース:ユーザーがログインし、Vaadin Table コンポーネントを開いて予定のステータスを表示しました。すべての行には、ステータス (Scheduled、Arrived、Reviewed) を変更するためのドロップダウン (ComboBox) があります。現在、複数のユーザーが自分のブラウザでこのテーブルを開き、予定のステータスを継続的に変更しています。これらの変更は、開いているすべてのテーブルに反映される必要があります。つまり、ユーザー A が予定 appt-1 のステータスを変更すると、現在開いているすべてのテーブルに反映されて更新されます。

以前は、ICE-PUSH アドオンを使用してイベント ベースの更新を適用していました。つまり、PC-1 (つまり、アプリケーション インスタンス a1) で変更が行われた場合、Vaadin アプリケーションの他のインスタンスをクラスの静的CopyOnWriteArrayListから取得し、MainApplicationそのインスタンスによって関数を呼び出しloadTableます。その後、ICEPUSH を呼び出して、新しい変更をすべてのユーザーにプッシュします。

public class MainApplication extends Application {
    public static CopyOnWriteArrayList<MainMedMaxApplication> appList=new CopyOnWriteArrayList<MainMedMaxApplication>();

    @Override
    public void init() {
        setMainWindow(new Window("APPointment Dashboard"));
        getMainWindow().setContent(mainLayout);
        setMainComponent(getCustomTable());
        //Custome Table make table . it also register listeners over table.
        //loadTable will load the table. 
        loadTable()
        appList.add(this);  
    } 
}

public void loadTabl(String date) {
    //this will reload the table component By Querying database
}
private void registerlistener() {
    table.addListeners()
        {
        //do any change to table in this instance and save it to db then call ICE push so it can referesh all app instances by getting from applist.
        synchronizePortlets();
        }
}
public void synchronizePortlets() {
    // TODO Auto-generated method stub
    Iterator<MainApplication>itM = appList.iterator();
    while(itM.hasNext()) {
        MainApplication app = itM.next();
        app.loadTabl();
        app.getPusher().push();
    }
}
}

これは正常に機能しますが、多くの頻繁な変更が行われると、同時変更例外が発生する場合があります。誰かがこれを改善するのを助けることができれば?

この後に私が考えている解決策は、テーブルコンポーネントを強制的に更新するのではなく、独自のアプリインスタンスによって1ミントごとに継続的に更新することです。これにより、データベースがクエリされ、更新されたステータスでテーブル コンテナーがリロードされます。この目的のために、私はリフレッシャーアドオンを使用しますが、例外ConcurrentModificationExceptionが発生します. したがって、ユーザーが何もできず、バックグラウンドでテーブルを簡単に更新できるように、ユーザーの観点からテーブルコンポーネントをフリーズすることを考えています。

このユースケースでより良い解決策がある場合は、教えてください。私はあなたに感謝しています。

Vaadin 6.8.12、Java 1.7、Apache Tomcat 7.42 を使用

4

1 に答える 1

2

ヴァーディン 6

別のスレッドから GUI に変更を加えているため、同期を適用する必要があります (Refresher と IcePush のどちらを使用するかは問題ではないと思います。どちらの場合も別のスレッドを使用すると思います)。インスタンスで同期しApplicationます。

Vaadin フォーラムのこの投稿を参照してください。

ヴァーディン 7

UI編集: Vaadin 7.1 にアップグレードし、UI#accessでこの新しいメソッドを使用することをお勧めします

于 2013-09-18T23:11:40.500 に答える