2011-09-21 45 views
0

我有一个JavaEE应用程序需要访问文件以获取有关安装的某些信息。EJB中全局访问的属性

此访问是只读的,我不需要在应用程序内更改该文件,即我不需要直接“文件”,只需要它的内容(一个字节数组)。

使用文件系统的EJB存在限制。我确实了解与此相关的问题,但我无法找出解决方案。

文件路径应该由用户配置,但不需要跟踪对文件内容的更改。一旦加载,它将保持不变,除非用户选择另一个文件。所以,我无法将它打包在应用程序存档中。

这种基于文件的方法是很久以前由我们拥有的一些遗留系统做出的决定。现在没有可行的方法来改变它,即我需要我的JavaEE应用程序使用该文件(至少一次)来加载它的内容。

另一个限制是该文件不能保存在数据库中。

我该如何做到这一点,而不违反文件系统访问的EJB限制?

我想过用户上传文件到服务器,然后在服务器上保存这些信息。但我该怎么做?该信息应该是全局可访问的,包括服务器的多个实例(例如,在集群体系结构中)。

用户应该配置一次该文件(不一定在主应用程序内,它可能是其他应用程序只是配置此)。即使服务器重新启动,仍然可以访问文件的内容,而无需用户进一步配置。

我在GlassFish v2.1.1服务器上使用EJB 3.0规范的JavaEE 5。

谢谢, Thiago。

+0

有趣的需求,为什么你不能坚持数据库中的数据?用户现在是否将文件上传到每个集群成员? – home

+0

我无法将其保存在数据库中,因为此文件可能包含访问它的信息。所以我没有办法在没有获取文件内容的情况下访问官方数据库。顺便说一下,如果我只是为了这个目的而使用简单的数据库(比如H2),那就没问题。用户只能上传文件一次。今天我们直接访问文件系统,违反了限制。 –

+0

如果今天有效,为什么要改变它?虽然这不是一个好习惯,但我已经看到许多基于EJB的应用程序正在访问文件系统...... – home

回答

1

我的建议如下:

  1. 用户JAX-WS与让用户上传文件通过一个WebService(您可以提供客户端)EJB 3。
  2. 使用Context类的menthod bind()将文件的内容存储在JNDI中。据我所知JNDI将在集群中传播,但也许你需要检查你的Java EE应用服务器的文档。

希望它有用。

+0

我在Google搜索了这个解决方案,并且发现[在JavaHowTo的帖子](http://javahowto.blogspot.com/2010/11/programmatically-bind-global-jndi.html),说绑定会直到服务器重新启动。即使应用程序服务器重新启动,我们也需要访问这些信息。 –

+0

该示例显式解析了servlet的preDestroy方法中的变量。所以如果你想让变量在重新启动时可用,就不要取消绑定变量。 –

0

你必须从EJB两种选择:

1)违反规范和使用标准的Java文件API从您的EJB访问它。如果你理解这在聚类,交易等方面意味着什么,那么可以是'安全'的。既然你只是在进行只读访问,你应该没问题。

2)使用支持文件系统访问的JCA适配器。你可以自己写,尝试一个开源的(我认为有一个源代码伪造),或者购买一个 - 我认为oracle销售一个用于Glassfish oracle版本的版本。可能是为了你的情况矫枉过正。

您也可以将Web应用程序组件添加到您的项目(Servlet)中,该项目可执行文件访问,因为该规范允许使用文件io。