多个Java服务器和批处理程序-XML配置噩梦

问题描述

| 我有一个大约包含的应用程序。 20个Java组件。 大约一半的组件是服务器,另一半是批处理程序。 几乎所有这些组件都直接与oracle数据库通信(通过一些基础结构代码jar通过jdbc进行通信),其他两个组件与与数据库通信的一些服务器通信。 无论如何,每个组件都配置有许多XML配置文件。 这些几乎变得不可能维护。 一些配置特定于某个组件,而其他一些则相似(数据库URL,连接器等) 更糟糕的是,该应用程序没有安装在许多环境中-实际上只有大约10个环境(质量保证,开发,生产等)。 但是拥有这些环境的人似乎无法正确维护配置。 特别是,每当进行升级时,总是会出现配置错误。 我什至开始将某些环境配置和代码一起检入SVN中。 我曾经尝试过一个xml模式验证器(它包括在.xsd文件中定义有效的XML,如果违反了模式规则,但是没有用,则抛出错误) 我想我在这里缺少一些基本知识-也许有一种工具可以管理此问题,或者我应该将配置存储在数据库中。 该应用程序主要是由一位同事设计的,但我觉得我的应用程序过于可配置-实际上,许多配置实际上都引用了类-即人们可以选择处理程序和解析器等-XML配置几乎就像代码一样。 任何建议,不胜感激 彼得     

解决方法

        用XML代替代码通常不是一个好主意。声明性的事情可能没问题,但是程序性的事情可能就不好。 如果所有这些配置都是用Java代码定义的,那么许多升级问题将变成编译问题。编译器会为您选择它们​​,您可以更正它们。 因此,您遇到了一个多方面的问题。您需要将配置信息合理化为一组分区(每个组件,每个安装,全局)。您需要尝试在编译时验证配置信息。并且您需要为已加载的配置编写验证,以对其进行完整性检查。 尽可能将配置相对静态的内容转移到Guice中(至少我更喜欢)。许多事情都以一种不错的,类型安全的方式发生。 考虑为应用程序的每个实例运行WebDAV服务器,并将配置存储到其中。每个用户都可以点击一个简单的URL来获取配置文件的当前版本。 或者,建立具有REST功能的轻量级XML数据库(如BaseX),然后在其中存储和加载配置信息。使用JSLP或类似的东西使您的组件找到中央配置存储库。 使用XML DB的另一个优点是,通过查询所有配置文件集,您将能够进行大量的健全性检查和更新。例如,如果给定的应用程序实例在每个配置文件中都应具有相同的JDBC参数,则简单的xquery会告诉您这是否成立。 如果您没有能力修改要提取配置文件的应用程序(配置文件格式是固定的),请考虑为XML数据库编写查询servlet,以从嵌套块或模板中组装所需的配置信息。 。这将使您找出配置文件之间的共同点,并动态生成这些块的参数化版本。 听起来这里的关键是逐步改进。允许使用旧方法进行配置,但要让配置负载首先查找中央配置源。     ,我认为配置文件的语法不是问题的核心:使用Java属性文件而不是XML会给您带来完全相同的问题。可能存在配置信息过于分散的问题-很难分辨。主要问题似乎是整个过程都太脆弱了-应用程序过于依赖手动配置,并且似乎每个环境的配置都需要不同。您应该集中精力减少具有智能默认设置和自配置功能,以减少使系统正常运行所需设置的配置参数数量(不必减少确实需要的诊断等选项)。 。也许甚至投资创建安装向导。     ,        由于您拥有一些Oracle数据库,为什么不将配置存储在其中? 然后,您只需要一个或两个配置参数即可指向适合该环境的Oracle数据库并从数据库下载其余配置。 对于任何给定的环境,配置表的内容都应该是静态的,因此在整个生命周期中迁移软件时,除了jdbc连接之外,无需修改任何内容。