2013-09-18 6 views
0

Использование: Пользователь вошел в систему и компонент таблицы 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

ответ

2

Vaadin 6

Вы должны применить синхронизацию, так как вы делаете изменения в GUI из другого потока (и я думаю, что это Безразлично» независимо от того, используется ли Refresher или IcePush, я думаю, что в обоих случаях вы будете использовать другой поток). Синхронизируйте по экземпляру Application.

См. this post на форуме Ваадин.

Vaadin 7

EDIT: Я призываю вас обновить Vaadin 7.1 и использовать этот новый метод на UI: UI#access, как рекомендуется here.

+0

вы можете видеть, что мы не используем копию на списке массива, который поточно в моем понимании – Mubasher

+0

до сих пор мы использовали много решений, но и на использование Синхронизировать блокировать это сделать приложение не отвечает, красный круг начинает вращаться, приложение идет в тупике, или исключение – Mubasher

+1

@Mubasher Поскольку эта проблема должна быть решена должным образом в Vaadin 7, рассмотрели ли вы обновление? Есть много других преимуществ для модернизации. – herman

Смежные вопросы