【问题标题】:Swapping in and out logic on a running system在正在运行的系统上交换进出逻辑
【发布时间】:2009-03-03 16:26:16
【问题描述】:

我想设计这个有两个主要组件的系统:

  1. 基础/核心内容。永不改变。
  2. 在核心上运行的东西。变化相当频繁。

这将在 Java 中开发,但问题适用于任何经典的 OO 语言。如何在运行的系统中替换上面的 2 而无需重新编译 1,甚至在运行时不停止 1。重新编译2没问题,但我不应该打扰1。

是否有任何设计模式可以做到这一点?我认为这有点类似于插件行为,但 2 实际上对于应用程序的工作至关重要,而不仅仅是一个附加组件。

【问题讨论】:

    标签: java design-patterns oop


    【解决方案1】:

    如果没有更多信息,很难回答...但您可以查看OSGi 作为一些想法的起点。

    【讨论】:

    • 这听起来像是在这种情况下最好的方法。谢谢!
    【解决方案2】:

    我们需要更多信息来解决这个问题。如果您谈论的是在运行时加载全新的逻辑,那可能会非常困难。如果您只是在谈论交换实现,则可以使用策略模式轻松完成。

    【讨论】:

      【解决方案3】:

      你需要一个插件模式来处理你经常变化的东西,再加上一些重新启动插件的界面。您的核心/基础 (1) 将负责动态加载包含您经常更改的内容 (2) 的程序集/罐子。

      【讨论】:

        【解决方案4】:

        这与 servlet 容器在处理 servlet 的热交换时遇到的问题集完全相同。网络服务器/容器应该连续运行,但必须能够按需加载新的 servlet。

        我建议你先看看 Tomcat 源代码 (available via these subversion URLs.)

        【讨论】:

          【解决方案5】:

          这基本上就是反射的用途。正如其他人所说,如果您遵循某种挂钩或插件模式,这应该可以帮助您完成大部分工作。基本上是这样的:

          1. 在您的代码中创建定义良好的接口来描述核心应用和插件之间的契约。
          2. 设计一种在配置中存储 jar/类信息的方法,以便您可以在运行时通过反射加载类型
          3. 在#1中描述的接口上通过反射和调用方法加载插件

          现在,如果您开始陷入工作流程实施的困境,那么可能是时候研究现成的工作流程引擎了。这里有太多要提及的内容,但 Google 搜索应该可以帮助您入门。

          【讨论】:

            【解决方案6】:

            通过在 Java 之上使用 JRuby,我曾经做过一些听起来与您的目标相似的事情。核心部分是用 Java 编写的,并且会一直运行,而 Ruby 脚本是使用 JRuby 动态加载的。这样,我可以在不重新启动(或编译)Java 部分的情况下添加功能。

            【讨论】:

              【解决方案7】:

              将源代码拆分为两棵树很容易。这些的编译形式可以单独交付,非核心内容编译时将核心添加到 -classpath。

              可以在运行时使用类加载器 (URLClassLoader.newInstance) 加载代码。您必须小心卸载旧代码。您需要确保在任何地方都绝对没有(强)引用它。

              【讨论】:

                【解决方案8】:

                显然,这正是为 Eclipse 之类的东西开发的那种东西;他们使用 OSGi 构建了一个插件框架。

                也就是说,我会选择一种可以在 JVM 上运行的脚本语言,例如 Jython、Rhino/JavaScript 或 JRuby。 Spring 等框架现在支持 the ability to define beans in these languages 并让它们动态重新编译。

                随着对动态语言(在 JDK6 脚本之上)的更多支持进入 JVM,这些可能会在未来被广泛采用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-06
                  • 2013-04-12
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多