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

Java EE EAR在集群环境中共享读/写资源的位置,java,deployment,jakarta-ee,Java,Deployment,Jakarta Ee,在JavaEE环境中(碰巧是WAS6.1,但可以是任何应用程序服务器),我需要放置一个XML文件,这是一个配置文件,以便我可以对其进行读写 这需要在集群环境中可用,因此我正在考虑使用类路径加载文件 我想我可以将这个文件存储在EAR根目录中,在清单中引用它,然后加载并保存它 我已经尝试过这种方法,将我的文件放在一个JAR中,并通过MANIFES使其可用,我可以从类路径加载配置文件,使用下面的方法没有问题 this.getClass().getClassLoader().getResourceAsS

在JavaEE环境中(碰巧是WAS6.1,但可以是任何应用程序服务器),我需要放置一个XML文件,这是一个配置文件,以便我可以对其进行读写

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

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

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

this.getClass().getClassLoader().getResourceAsStream("configFileName");
加载JAR中的文件,这太棒了。但如果我想以编程方式编辑此文件,我无法访问JAR文件位置(EAR root),它会返回一个解释路径,如下所示:

 /usr/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/MyApp.ear/MyApp.war/TB_config.jar
这不是JAR的正确位置,正确位置在MyApp.ear

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


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

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

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

在JAR中嵌入配置文件的问题是文件的绝对路径或物理路径,以防需要更新。如果您的容器不会分解EAR和WAR文件,那么将配置文件与代码放在一起是一个坏主意-管理员将不得不部署一个较新版本的EAR/WAR/JAR。当然,除非您可以将容器配置为分解工件——WebLogic服务器会这样做,我不确定WAS

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

  • 将配置文件存储在SAN中,群集中的所有节点都可以通过“规范”路径访问该SAN。这样,您就可以从集群中的任何节点找到文件并对其进行更新。提醒自己限制对此目录的访问。虽然这听起来很简单,但不一定如此——一旦配置文件被更新,Java对象可能必须跨节点“刷新”。此外,您可能必须满足可以在应用程序外部编辑属性文件的场景
  • 使用数据库。简单得多,几乎没有麻烦,只是Java对象可能需要再次刷新
  • 使用MBean。和数据库一样好,只是我不知道有多少人在WAS中为MBean提供支持。此外,在这种情况下,我不确定对象状态是否会在集群中失控

实际上,在我使用WebSphere时,似乎可以使用WebSphere部署管理器提供的动态缓存。下面链接的最后一章讨论如何使用动态缓存在集群中提供共享对象。配置文件是XML,由应用程序的引擎解析为XML(文档对象),也是Java对象,因此可以将其放入DistributedMap中

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


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

这是一个梦想


因此@stacker,节点被管理,管理器将文件分发给节点。

您有什么理由必须使用文件?为什么不使用db表呢?这个成熟的应用程序使用一个配置文件。我正在编写一个管理应用程序来管理应用程序。唉,使用配置文件的应用程序的重新设计不在范围之内。这是我想到的。甚至可能在引擎初始化时存储在数据库中并写入配置文件?另外,network deployment manager体系结构如何。将文件存储在共享库中如何?在ND级别创建时,这些数据是否在集群上共享?但是我可以写那个共享库吗?我想这取决于文件权限,也可能会遇到物理位置的问题。如果您的目标是很少或没有停机时间,那么重新部署工件是应该避免的,除非应用程序服务器支持像EJB这样的托管对象的版本控制,也就是说,它可以继续使用旧的代码库处理请求,直到新的代码库完全部署。我不确定WebSphere在这方面的功能,但我知道的一件事是,开发人员过去只使用配置文件部署EJB JAR文件,因为容器允许在运行中重新部署EJBs.Hello。谢谢你的回复。是的,这已经被考虑过了,它可能是解决方案。但是共享LIB呢?你认为这是一种选择吗。DB解决方案尚未实现的另一个原因是,配置文件也应该能够在管理应用程序之外进行手动编辑,因此DB,尤其是使用clob(字符大对象)将无法进行手动编辑。@Gurnard这只能通过共享文件系统(如NFS)或Vinet所述来实现。一个节点(主机)如何访问另一个文件系统?忘了写jar文件吧。顺便说一句,如果答案是有帮助的哟