Используйте ключевое слово Java volatile в модели EMF.

Мы используем EMF 2.7 вместе с многопоточным приложением Eclipse RCP 3.x. Теперь к некоторым моделям EMF и функциям/свойствам, соответственно, обращаются разные потоки. Поэтому нам нужно сделать эти переменные volatile[1].

Есть ли способ в файлах .ecore или .ecorediag настроить свойства модели EMF таким образом, чтобы генератор кода автоматически добавлял ключевое слово volatile в сгенерированный код модели? или нам нужно вручную добавить его в сгенерированный код (как бы это не подходило ..)?

Было бы очень полезно, если бы volatile можно было указать в определении модели, а не в сгенерированном коде.

Вот пример добавленной вручную volatile в сгенерированной модели EMF:

public class EGuiStateImpl extends MinimalEObjectImpl.Container implements 
     EGuiState {
/**
* @generated NOT
*/
protected volatile ESummary summary;

[1] ключевое слово Java volatile используется для указания того, что значение переменной будет изменено разными потоками.


person Lukas Z.    schedule 17.12.2014    source источник


Ответы (2)


Модели, сгенерированные EMF, по умолчанию не подготовлены для многопоточности. «Volatile» в EMF означает, что свойство (также известное как функция) не будет генерировать какое-либо поле, оно не имеет ничего общего с синтаксисом volatile из Java. (Вы должны прочитать книгу EMF или хотя бы EMF Refcardz)

Вы всегда можете изменить шаблоны javajet для создания другого кода, но опять же, это не рекомендуется, поскольку генерация EMF по умолчанию не предназначена для многопоточности.

Если вам нужно многопоточное приложение на основе EMF, рассмотрите возможность использования EMF CDO, который также поддерживает транзакции.

person xsilmarx    schedule 18.12.2014

В модели ecore под EClass выберите EAttribute или EReference, который вы хотите сделать изменчивым. Щелкните правой кнопкой мыши-> Показать свойства. В конце представления свойств есть параметр Volatile, который по умолчанию равен false.

Примечание. На самом деле я не пробовал, но предполагаю, что изменение должно сработать.

person Nick Wilson    schedule 17.12.2014
comment
Нет, это не работает. К сожалению, в EMF есть собственное понятие volatile, атрибут volatile — это атрибут, для которого не выделяется память во время выполнения [EMFbook]. Поэтому, когда я делаю это, генератор фактически удаляет переменную класса и создает пустой метод доступа с TODO следующим образом: @Override public ESummary getSummary() { // TODO: implement this method to return the 'Summary' attribute // Ensure that you remove @generated or mark it @generated NOT throw new UnsupportedOperationException(); } - person Lukas Z.; 17.12.2014
comment
Вы правы, это не так. В этом случае я не могу найти комбинацию атрибутов или других настроек, которые помечали бы его как volatile. @Generated NOT может быть единственным вариантом. - person Nick Wilson; 17.12.2014