2015-03-13 2 views
0

У нас есть приложение Java EE с первичными гранями, и нам интересно, есть ли способ иметь «глобальную» прикладную переменную.Приложение Java EE и «глобальные» переменные

Я имею в виду: представьте, что пользователь1 редактирует документ1, когда пользователь2 пытается получить доступ к документу 1, мы хотели бы показать сообщение: «User1 уже редактирует этот документ».

Итак, мы должны использовать что-то «глобальное» для отслеживания действий пользователя или блокировки документов и т. Д., Что лучший способ достичь этого?

Я ищу в Интернете, но мнение отличается, и обычно рабочих примеров не предусмотрено, поэтому ссылки и указатели приветствуются!

EDIT: приведенный выше пример, пожалуйста, не сосредотачивайтесь на «документах», вы можете назвать его «ресурсами» или любым другим, что вам нравится. В качестве примера я использовал проблему блокировки документов, но это может быть общий счетчик или что-то еще, что должно быть хранилищем на уровне приложения. То, что я прошу (и жаль, если это было неясно), заключается не в том, как управлять блокировкой документов, но как лучше всего иметь «глобальную» переменную на уровне приложения в Java EE, если это возможно.

Спасибо

Просто любопытно: почему, если добавить «Hola» или «привет», как первой линии она исчезает, когда я сохраняю редактировать?

+0

Как вы поддерживаете документы? –

+0

Извините, я не понимаю вопроса. Не могли бы вы добавить подробности? –

+0

Я имею в виду, вы используете CMS, базу данных или что-то еще? как вы управляете документами? Если CMS, то, я думаю, у вас есть опции для блокировки и проверки состояния документа. –

ответ

1

Если вы хотите сохранить что-то во всем мире, в Java EE 6+ он должен использовать Scope Application

http://docs.oracle.com/javaee/6/api/javax/enterprise/context/ApplicationScoped.html

Для пример:

@ApplicationScoped 
class Global { 
    void setDocInUse(boolean) { ... } 
    boolean isDocInUse() { ... } 
} 

@RequestScoped 
class MyDocEditor { 

    @Inject Global global; 

    public void edit() { 
     if (global.isDocInUse()) { ... } 
     else { ... } 
    } 
} 
+0

Я думаю, что это решение не работает через кластер из коробки. Это? – badera

+0

Нет, @ApplicationScoped не используется между членами кластера. Если вы хотите глобальное кластеризованное значение, это другая история – AndresQ

-1

Для большинства простых случаев вы можете использовать статическое поле внутри ваших управляемых компонентов для этой цели, поскольку оно будет использоваться всеми экземплярами вашего управляемого компонента. Например, представим себе, что для редактирования документов вы пользователи взаимодействуют со следующими боба:

@ManagedBean 
@ViewScoped  
public class DocumentManager { 
    private static Map<Long, String> editedDocs = new HashMap<>(); 
    private Document selectedDoc; 

} 

Тогда давайте представим себе, что после того, как пользователи выбрали документ (например, из DataTable так, что она попадает в поле selectedDoc) они получают страницу редактирования документа, нажав на кнопку, которая атрибут указывает действие к методу editDocument, как это:

затем в методе editDocument мы добавим идентификатор и имя пользователя, который нажал на документа на отображение, которое отслеживает редактируемые документы.

public String editDocument() { 
    if (!editedDocs.contains(selectedDoc.getId())) { 
     String username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName(); 
     editedDocs.put(selectedDoc.getId(), username);  

     String msg = "User " + username + " is already editing the document"; 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg)); 
    } 
    return theAddressOfEditDocumentPage; 
} 

Пожалуйста, не забудьте удалить идентификатор документа и имя пользователя из editedDocs, когда пользователь покидает страницу редактирования (нажав кнопку Сохранить или Отменить кнопки). Другая возможность хранить такое отображение извне (например, в базе данных)

+1

Это решение не является потокобезопасным и также не будет работать в кластерной среде. –

+0

код, который я предоставил, призван проиллюстрировать идею о том, как это можно сделать, а не готовый к использованию код быка. Если вы помните, я также собирался хранить отображение извне, которое будет работать в кластерной среде. Поэтому он находит ваш downvote бессмысленным. – akhilless

+0

Также, кстати, я не помню, чтобы ОП упоминал, что он использует кластер. – akhilless

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