代码之家  ›  专栏  ›  技术社区  ›  Rakesh Pai

在运行中的系统上交换输入和输出逻辑

  •  2
  • Rakesh Pai  · 技术社区  · 17 年前

    1. 基础/核心材料。永不改变。

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

    8 回复  |  直到 17 年前
        1
  •  6
  •   TofuBeer    17 年前

    OSGi 作为一些想法的起点。

        2
  •  2
  •   Tim Frey    17 年前

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

        3
  •  2
  •   Randolpho    17 年前

    你需要一个插件模式来处理你经常更换的东西,再加上一些重新启动插件的接口。你的核心/基础(1)将负责动态加载包含你经常更换的东西的组件/罐子(2)。

        4
  •  2
  •   Jared    17 年前

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

    我建议您首先查看一下Tomcat的源代码( available via these subversion URLs .)

        5
  •  2
  •   Mike Marshall    17 年前

    这基本上就是反思的目的。正如其他人所说,如果你遵循某种钩子或插件模式,这应该会让你走得更远。基本上是这样的:

    1. 在代码中创建定义良好的接口,描述核心应用程序和插件之间的契约。
    2. 通过#1中描述的接口上的反射和调用方法加载插件

    现在,如果您开始陷入工作流实现的泥潭,那么可能是时候研究现成的工作流引擎了。这里有太多值得一提的,但谷歌搜索应该能让你开始。

        6
  •  2
  •   Fabian Steeg    17 年前

        7
  •  1
  •   Tom Hawtin - tackline    17 年前

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

        8
  •  1
  •   oxbow_lakes    17 年前

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

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

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