2015-03-13 43 views
0

我们有一个带有primefaces的Java EE应用程序,我们想知道是否有一种方法来创建“全局”应用程序变量。Java EE应用程序和“全局”变量

我的意思是:设想user1正在编辑document1,当user2尝试访问document1时,我们想显示一条消息:“User1正在编辑此文档”。

因此,我们必须使用“全局”来跟踪用户操作或文档锁定等,实现此目的的最佳方法是什么?

我在搜索互联网,但意见不同,通常没有提供任何工作示例,因此欢迎链接和指针!

编辑:上面只是一个例子,请不要专注于“文档”,你可以称之为“资源”,或者任何你喜欢的。我以文档锁定问题为例,但它可能是总计数器或其他需要在应用程序级别存储的其他内容。 我在问什么(抱歉,如果不清楚)不是如何管理文档锁定,但如果可能的话,在Java EE的应用程序级别拥有“全局”变量的最佳方式是什么?

谢谢

只是好奇:为什么如果我添加“HOLA”或“喜”,作为一线它消失的时候我保存编辑?

+0

如何维护文档? – 2015-03-13 16:21:54

+0

对不起,我不明白这个问题。你可以请添加细节? – 2015-03-13 16:27:19

+0

我的意思是你使用CMS,数据库或其他东西?你如何管理文件?如果CMS,那么我想你有选项来锁定和检查文档的状态。 – 2015-03-13 16:36:36

回答

1

外部存储这种映射如果你想在全球范围内保存的东西,在Java EE 6 +它应该使用适用范围

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 2015-11-26 18:34:56

+0

不,@ApplicationScoped不在集群成员之间共享。如果你想要一个全球聚集值,这是一个不同的故事 – AndresQ 2015-11-26 20:05:56

-1

对于大多数简单的情况,您可以在托管bean内部使用一个静态字段,因为它将由托管bean的所有实例共享。例如,让我们想象一下,编辑您的用户具有以下Bean交互文件:

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

} 

那就让我们想像中,用户已经从数据表中选择的文档(例如后,使其进入了selectedDoc场

然后在editDocument方法中,我们添加了文档的ID和对点击的用户的用户名:),他们通过点击其action属性指向方法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; 
} 

请不要忘记在用户离开编辑页面时删除的文档ID,并从editedDocs的用户名(通过单击保存或取消按钮)。 另一种可能性是(在例如数据库)

+1

此解决方案不是线程安全的,也不能在集群环境中工作 – 2015-03-16 02:00:29

+0

我提供的代码旨在说明如何完成它的想法,它不是一个公牛即兴使用的代码。如果你还记得,我还打算将外部映射存储在集群环境中。所以它找到你downvote毫无意义。 – akhilless 2015-03-16 06:04:22

+0

另外通过我不记得OP提及他使用群集的方式。 – akhilless 2015-03-16 06:11:30