技术开发 频道

Java组件开发要决:一个概念框架


在企业应用中组件只有一个实例在运行

  一个组件应该有且只有一个实例在运行,而Singleton设计模式是合适的选择来保证在JVM中只有一个实例。但是当这种模式在单一JVM情形下可行,但是在多JVM情形下就有问题。但是由于配置信息在组件开始时载入而不需要改变并处理所有静态信息,用Singleton设计模式依然可行。
 
Singleton控制工厂提供的方法是:
 
·getXXXService():方法返回在XML文件中定义的服务提供的实现类
·getXXXAdapter():方法返回在XML文件中定义适配实现类
 
配置文件的更改应该是动态的
 
如果组件是不可变的,每串代码应该有与singleton实例同样的拷贝,但是如果它是不是不变得,我们需要改变时,配置文件需要动态改变。
 
有两种可能的情况但动态配置文件更改:
 
·单一JVM情况
·多JVM情况
·单一JVM情况
 
  如果程序在单一JVM中运行,事情就简单得多了。我们已经知道,SingletonControllerFactory通常在JVM中有一个实例,所以任何时候配置文件发生任何改变,将需要根据一些通知机制轮流载入Java串行的配置对象来重新载入工厂对象。这是基于Observer-Observable模式并做两件事:
 
·通过XMLizer(单独的组件)来读取和处理XML配置文件并载入Java配置对象。监视XML配置文件可能发生的更改。ConfigManager类当被Observable通知时扮演Observer角色,其更新方法将会被调用。Update()方法将会调用SingletonControllerFactory的reload()方法,所以新创建的Java对象将会从其配置信息中重新载入。
 
·ConfigurationChangeNotifier扮演Observable的角色并在XML配置文件发生更改时启动通知ConfigManger线程,并将指出其内容上的改变。
 
多JVM情况
 
  在多JVM情况下,事情就不会变得这样简单。我们必须有需要机制在运行时来动态载入更改的XML配置文件而不关闭整个企业程序。需要机制保证在群中只有一个实例在运行。结合RMI利用JNDI是一种选择来保证在集群环境中的多个节点中的特定的一个节点自由一个实例在运行。RMI服务需要编写,同时RMI stub要在RMI服务之外创建。创建的RMI stub需要被绑定在程序服务器的JNDI树上。这个对象将保持在container中,container可以让对象在集群中都可以用到。
 
为了处理这种情况,我们需要引入ConfigManager,它将会做一下任务:
 
·创建需要可以动态改变的XML配置文件。
·创建来自XML文件的Java串行文件。串行和非串行化将会在不同的组件中完成。
·创建RMI服务,注册从RMI服务中创建的RMI stub,并通过RMI服务载入串行配置对象。
·将RMI stub与集群环境中的JNDI树的任何节点绑定。
·创建通知系统,其将重新绑定RMI服务并当XML文件似乎发生变化时重新载入对象。
 
  ConfigManagerMultipleJVM类扮演Observer的角色。当他被Observable通知时,其update方法将会被调用。通过update()方法,rebindRMIService()方法将会被调用,这样新创建的对象(通过最新的配置信息)将会被重新载入。SingletonControllFactory将会为RMI服务扮演wrapper角色,返回合适的已配置的对象。这种方法的会产生问题,因为只有一个实例,所以只可以允许一个点的错误。ConfigManager组件需要更强壮来处理错误。但是同样有其他的方法,通过MDB和JMS在群众的不同节点同步缓存的配置对象。在这种情况下,并不需要RMI服务。下面是实现这种方法的步骤:
 
·SingletonControllerFactory通过配置对象初始化并开始组件。
·ConfigManager的Observer-Observable模型通过其通知机制来跟踪XML配置文件的任何变更。当发现更改时,他将公布消息到JMS topic。运行在集群环境中的每个群中的MDB触发其onMessage()方法,并载入更改的配置Java对象。
 
组件应该有合适的第三方软件整合机制
 
  如果组件依赖第三方软件整合来建立服务,第三方API不应该直接在实现类中使用。非常好的的策略是开发适配器并隔离第三方软件调用和适配器的实现。利用adapter模式的优点是更容易的和第三方软件APIs合并。此外,当这些APIs改变时,适配实现需要改变,而用此适配接口的服务将不需要改变。通过XML配置文件从不同的适配器中选择是便利的,就如上面这节介绍的那样。
 
组件应该有合适的错误处理机制
 
  每个组件应该有自己的异常处理类,它可以帮助捕捉适当的异常。假设我们对于特定的即将使用的商业程序有单独的组件来处理异常。这个特定组件异常类(Underwriter exception)将会使需要的服务脱离异常处理组件。这个异常处理类是特定用于Underwriter服务并扩展基于企业程序的异常类。其工作就是掩盖在服务类中产生的异常并重新释放他。
 
结论
 
总的来说,以下是整合的基本步骤:
 
·作为程序开始过程的一部分,ConfigManager键通过XMLizer(用于XML-to-Java对象转换的单独对象)来为不同的组件读取XML配置文件,并通过程序服务器节点的JNDI tree来绑定Java配置对象。
·作为程序开始过程的一部,配置对象将会被读取,因此相关的provider/adapter/service需要被说明。如果配置文件发生更改,ConfigManager将读取更改后的XML文件并重新绑定配置对象。

·组件将会重新载入配置对象并根据其最新更改来重新初始化。回到我们开始的地方,当你计划开发强壮的系统时组件框架将会有效地适应商业和技术上的改变。概念框架的非常好的部分是通过引入不同的即插即用的服务提供商的概念,完全将组件管理/生命周期进程与商业逻辑和不同的第三方APIs隔离。即使发生改变,除了更改/替代服务提供商,你也不需要担心代码的其他部分。这样可以使程序更易维护,更易适应,和更强壮。

0
相关文章