ユースケース:ユーザーがログインし、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 を使用