我在 JBoss 中实现了一个基于 EJB 的系统。
我的一个消息驱动 bean 将负责发送电子邮件。我希望将电子邮件模板存储在外部(可能作为 XML),以便可以轻松更改它而无需更改代码/重新部署 bean 等。
该文件应该放在哪里以及如何引用它?
我在 JBoss 中实现了一个基于 EJB 的系统。
我的一个消息驱动 bean 将负责发送电子邮件。我希望将电子邮件模板存储在外部(可能作为 XML),以便可以轻松更改它而无需更改代码/重新部署 bean 等。
该文件应该放在哪里以及如何引用它?
JBoss 文档指定环境变量 jboss.server.data.dir 是“可供想要在文件系统中存储内容的服务使用的位置”。有关更多详细信息,请参见此处。您可以通过以下方式获取变量的值
System.getProperty("jboss.server.data.dir");
并且,如链接所示,将返回 server/[config]/data 目录的位置。部署应用程序时将模板文件存储在那里,并指示您的管理员在那里修改它。
这个问题和这篇博客文章是指属性文件,但所讨论的内容也适用于其他类型的文件。一种解决方案是将 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 来定义文件的路径。
或者将其放入数据库中,您可以通过 SQL 客户端获取它。在启动时加载它,或者轮询以检查时间戳更改并重新加载它。
你是指什么样的模板?它是您以邮件合并方式填充的 Velocity 模板吗?
我喜欢数据库设计的一件事是,您可以将更多信息添加到超出单纯文件的架构中。您可以包含时间戳、更新模板的用户 ID、版本、元数据、系统名称、表示“活动”或“休眠”的布尔值等。您的 EJB 可以非常聪明地选择它选择的模板。如果您只是将文件停放在服务器驱动器上,您可能会发现自己拥有更多的选择。通过这种方式,它们也可用于其他应用程序。如果您稍微使用它,可能是一个不错的设计。
如果将其添加到展开部署的 WEB-INF/classes 目录,则可以使用“getResourceAsStream()”轻松引用它。如果您不想退回服务器,请添加轮询功能。