JBoss/EJB - 自定义配置文件的位置

4

我正在JBoss中实现一个基于EJB的系统。

我的其中一个消息驱动bean将负责发送电子邮件。我希望电子邮件模板存储在外部(可能是XML),以便可以轻松更改而不必更改代码/重新部署bean等。

这个文件应该放在哪里,如何引用它?


请注意,从EJB访问任意文件是不允许的(参见如何从EJB 3访问文件系统)。在我看来,@duffymo的回答是最好的选择(将模板存储在数据库中)。或者,您可以像链接问题中的一个回答中提到的那样使用JNDI。 - Filou
3个回答

2
JBoss文档指定环境变量jboss.server.data.dir是“可用于存储文件系统中内容的服务的位置”。更多详情请参见这里。 您可以通过以下方式获取该变量的值:
System.getProperty("jboss.server.data.dir");

如链接所示,服务器/[config]/data目录的位置将被返回。在部署应用程序时,请将模板文件存储在那里,并指示管理员在那里进行修改。


刚刚尝试了一下,成功了。目前看来,这似乎是我们最好的解决方案——不过我有点困惑,因为我认为可以访问文件系统是违反 EJB 规范的? - William
此外,如果我们需要在集群中运行多个 JBoss 服务器,这是否会导致问题 - 即同一文件是否需要在每个服务器上复制?我现在考虑的替代方案是将信息存储在 JNDI 树上,这似乎更具可扩展性。 - William
是的,在集群部署中访问文件系统会有问题。在这种情况下,我认为文件访问过于简单化,最好采用另一种解决方案。如果您正在运行一个值得使用集群环境的系统,也许您可以考虑使用配置服务来隐藏访问模板信息的细节。 - Armadillo

1

这个问题和这个博客帖子涉及到属性文件,但讨论的内容也适用于其他类型的文件。一个解决方案是将XML文件放在标准位置,并像以下代码一样读取它(代码摘自上面的链接):

String path = System.getProperty("catalina.base")

                  + System.getProperty("file.seperator")

                  + "YOUR_FILE.properties";

FileInputStream fis = new FileInputStream(path);

你可以使用user.dir,甚至定义自己的环境变量(mypath_to_xml_file),并使用System.getProperty读取它,而不是使用catalina.base。

另一种解决方案是使用JNDI来定义文件路径。


1

或者将其放入数据库中,通过SQL客户端访问它。在启动时加载它,或者定期轮询以检查时间戳的更改并重新加载它。

你说的是什么样的模板?是一种Velocity模板,你可以像邮件合并一样填充它吗?
我喜欢数据库设计的一点是,你可以向模式中添加比一个简单文件更多的信息。你可以包括时间戳、更新模板的用户ID、版本、元数据、系统名称、一个布尔值来指示“活动”或“休眠”等等。你的EJB可以非常聪明地选择哪个模板。如果你只是将文件存储在服务器驱动器上,你可能会发现自己有更多的选项。它们也将对其他应用程序可用。如果你稍微运行一下,这可能是一个不错的设计。

如果将其添加到已展开部署的WEB-INF/classes目录中,你可以使用“getResourceAsStream()”轻松引用它。如果你不想强制重启服务器,可以添加一个轮询功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接