【问题标题】:Swapping in and out logic on a running system在正在运行的系统上交换进出逻辑
【发布时间】:2009-03-03 16:26:16
【问题描述】:
我想设计这个有两个主要组件的系统:
- 基础/核心内容。永不改变。
- 在核心上运行的东西。变化相当频繁。
这将在 Java 中开发,但问题适用于任何经典的 OO 语言。如何在运行的系统中替换上面的 2 而无需重新编译 1,甚至在运行时不停止 1。重新编译2没问题,但我不应该打扰1。
是否有任何设计模式可以做到这一点?我认为这有点类似于插件行为,但 2 实际上对于应用程序的工作至关重要,而不仅仅是一个附加组件。
【问题讨论】:
标签:
java
design-patterns
oop
【解决方案1】:
如果没有更多信息,很难回答...但您可以查看OSGi 作为一些想法的起点。
【解决方案2】:
我们需要更多信息来解决这个问题。如果您谈论的是在运行时加载全新的逻辑,那可能会非常困难。如果您只是在谈论交换实现,则可以使用策略模式轻松完成。
【解决方案3】:
你需要一个插件模式来处理你经常变化的东西,再加上一些重新启动插件的界面。您的核心/基础 (1) 将负责动态加载包含您经常更改的内容 (2) 的程序集/罐子。
【解决方案5】:
这基本上就是反射的用途。正如其他人所说,如果您遵循某种挂钩或插件模式,这应该可以帮助您完成大部分工作。基本上是这样的:
- 在您的代码中创建定义良好的接口来描述核心应用和插件之间的契约。
- 设计一种在配置中存储 jar/类信息的方法,以便您可以在运行时通过反射加载类型
- 在#1中描述的接口上通过反射和调用方法加载插件
现在,如果您开始陷入工作流程实施的困境,那么可能是时候研究现成的工作流程引擎了。这里有太多要提及的内容,但 Google 搜索应该可以帮助您入门。
【解决方案6】:
通过在 Java 之上使用 JRuby,我曾经做过一些听起来与您的目标相似的事情。核心部分是用 Java 编写的,并且会一直运行,而 Ruby 脚本是使用 JRuby 动态加载的。这样,我可以在不重新启动(或编译)Java 部分的情况下添加功能。
【解决方案7】:
将源代码拆分为两棵树很容易。这些的编译形式可以单独交付,非核心内容编译时将核心添加到 -classpath。
可以在运行时使用类加载器 (URLClassLoader.newInstance) 加载代码。您必须小心卸载旧代码。您需要确保在任何地方都绝对没有(强)引用它。