Использование: Пользователь вошел в систему и компонент таблицы Vaadin, отображающий статусы встреч. Каждая строка имеет раскрывающееся меню (ComboBox) для изменения статуса (по расписанию, приходу, просмотру). Теперь несколько пользователей открыли эту таблицу в своих браузерах и постоянно изменяли статус назначения. Эти изменения должны отражаться на всех открытых таблицах, если пользователь A изменяет статус назначения appt-1, который он отражает и обновляет во всех открытых в настоящее время таблицах.Как обновить других пользователей Таблица Vaadin без возникновения одновременной модификации Исключение?
Ранее мы применили освежающий на основе событий с ICE-PUSH т.е. Add-на, если изменение сделано на PC-1 (т.е. Application экземпляр 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 монетном дворе своими собственными экземплярами приложения. Это запросит базу данных и перезагрузит контейнер таблицы обновленными состояниями. Для этого я использую надстройку Refresher. Но он вызывает исключение i.e ConcurrentModificationException
, потому что иногда пользователь также меняет компонент таблицы, изменяя статусы комбо в таблице, а обновляя таблицу, и здесь возникает одновременное исключение модификации. Поэтому я думаю о замораживании компонента Table с точки зрения пользователя, поэтому пользователь ничего не может сделать, а в фоновом режиме может легко обновить таблицу.
Если для этого варианта использования у вас есть лучшее решение, пожалуйста, скажите мне. Я благодарен вам.
Использование Vaadin 6.8.12, Java 1.7, Apache Tomcat 7,42
вы можете видеть, что мы не используем копию на списке массива, который поточно в моем понимании – Mubasher
до сих пор мы использовали много решений, но и на использование Синхронизировать блокировать это сделать приложение не отвечает, красный круг начинает вращаться, приложение идет в тупике, или исключение – Mubasher
@Mubasher Поскольку эта проблема должна быть решена должным образом в Vaadin 7, рассмотрели ли вы обновление? Есть много других преимуществ для модернизации. – herman