【问题标题】:Globally accessible property in EJBEJB 中的全局可访问属性
【发布时间】:2011-09-21 16:03:40
【问题描述】:

我有一个 JavaEE 应用程序,它需要访问一个文件以获取有关安装的某些信息。

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

对使用文件系统的 EJB 有限制。我确实了解与之相关的问题,但我无法找到替代解决方案。

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

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

另一个限制是这个文件不能持久化到数据库中。

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

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

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

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

谢谢, 蒂亚戈。

【问题讨论】:

  • 有趣的需求,为什么不能将数据持久化到数据库中?用户今天是否将文件上传给每个集群成员?
  • 我无法将它保存在数据库中,因为该文件可能包含访问它的信息。所以如果不获取文件的内容,我就无法访问官方数据库。顺便说一句,如果我可以为此目的使用一个简单的数据库(如 H2),那就没问题了。用户应该只上传一次文件。今天我们直接访问文件系统,违反了限制。
  • 如果它今天有效,为什么要改变它?虽然这不是一个好习惯,但我已经看到数十个基于 EJB 的应用程序访问文件系统......
  • 我们现在没有使用集群设置,我们计划很快支持它。无论如何,即使它现在以这种方式工作,这也违反了 EJB 规范的限制,我们迟早会遇到这个解决方案的一些缺点。

标签: jakarta-ee glassfish ejb ejb-3.0 java-ee-5


【解决方案1】:

我的建议如下:

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

希望对你有用。

【讨论】:

  • 我在谷歌搜索过这个解决方案,我发现a post at JavaHowTo 说绑定只会持续到服务器重新启动。即使应用程序服务器重新启动,我们也需要能够访问这些信息。
  • 该示例在 servlet 的 preDestroy 方法中显式地取消绑定变量。因此,如果您想让变量在重新启动时可用,请不要取消绑定变量。
【解决方案2】:

EJB 有两个选择:

1) 违反规范并使用标准 Java 文件 API 从您的 EJB 访问它。如果您了解这在集群、事务等方面的含义,则可能是“安全的”。由于您只进行只读访问,因此应该没问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多