Java EE EAR在集群环境中共享读/写资源的位置

时间:2010-07-19 15:32:30

标签: java deployment java-ee

在Java EE环境中(恰好是WAS 6.1但可能是任何应用程序服务器)我需要放置一个XML文件,这是一个配置文件,以便我可以读写它。

这需要在集群环境中可用,所以我正在考虑使用类路径来加载文件。

我想我可以将此文件存储在EAR根目录中,在清单中引用它,然后加载并保存它。

我已经尝试过这种方法,将我的文件放在JAR中并通过MANIFES使其可用,我可以使用以下方法从类路径加载配置文件没问题。

this.getClass().getClassLoader().getResourceAsStream("configFileName");

加载JAR中的文件,这太棒了。但是,如果我想以编程方式编辑此文件,我无法访问JAR文件位置(EAR根目录),它会返回一个如下所示的解释路径:

 /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/MyApp.ear/MyApp.war/TB_config.jar

这不是JAR的正确位置,正确的位置是在MyApp.ear。

所以问题是:如何使用我的配置文件访问和更新(复制内容,创建新的,保存,删除旧)JAR。
或者我应该将配置文件放在其他地方?

什么是标准Java EE,以使需要读取/写入访问权限的文件可用于群集上的WAR?

4 个答案:

答案 0 :(得分:2)

你遇到的问题不是唯一的。许多Java EE程序员都很难为集群管理员提供“可配置”属性文件。你所选择的解决方案也有其局限性。

在JAR中嵌入配置文件的问题是绝对路径或文件的物理路径,以防您需要更新它。如果您的容器不会爆炸您的EAR和WAR文件,那么将配置文件放在代码旁边是个坏主意 - 管理员必须部署更新版本的EAR / WAR / JAR。当然,除非您可以配置容器来爆炸工件 - WebLogic Server执行此操作,我不确定WAS。

有几种方法可以解决此问题:

  • 将配置文件存储在SAN中,该SAN可通过“规范”路径访问群集中的所有节点。这样,您可以从群集中的任何节点找到该文件并进行更新。提醒自己限制对此目录的访问。虽然这听起来很简单,但不一定是 - 一旦配置文件更新,Java对象可能必须在节点之间“刷新”。此外,您可能必须满足在应用程序外部编辑属性文件的情况。
  • 使用数据库。更简单,几乎无忧无虑,除了可能必须再次刷新Java对象。
  • 使用MBean。和数据库一样好,除了我不知道很多人在WAS中担保MBean支持。此外,在这种情况下,我不确定对象状态是否会在群集中出现乱码。

答案 1 :(得分:2)

好的,我为此建立了一个解决方案。它更基于WebSphere(我们的平台),但它是J2EE,我很惊讶它没有提到。基本上我使用JMX来同步节点。文件存储并保存到部署管理器,然后使用JMX调用重新同步节点,然后通过调用应用程序中的servlet重新启动带有应用程序的引擎。

它是一个梦想

所以@stacker管理节点,管理器将文件分发给节点。

答案 2 :(得分:1)

您不能写入ear文件,您应该将XML文件作为文本lob(大对象)放在DB中。

答案 3 :(得分:0)

实际上,当我使用WebSphere时,似乎我可以使用WebSphere Deployment Manager提供的动态缓存。下面链接的最后一章讨论了使用动态高速缓存在集群中提供共享对象。配置文件是XML,由应用程序的引擎(到Document对象)解析,因此是Java对象,因此可以将其放入DistributedMap中。

看起来像一个干净的解决方案。感谢大家阅读和回复。

http://www.ibm.com/developerworks/websphere/library/techarticles/0606_zhou/0606_zhou.html