在Java中加载运行时类
我想做一个服务,它全天候运行,可以加载新模块或已加载模块的更新版本,而无需重新启动 我可以用如下方式从jar文件加载类:在Java中加载运行时类,java,dynamic-class-loaders,Java,Dynamic Class Loaders,我想做一个服务,它全天候运行,可以加载新模块或已加载模块的更新版本,而无需重新启动 我可以用如下方式从jar文件加载类: @FunctionalInterface public interface IWorker { void doStuff(); } IWorker worker; try { URL[] urls = { new URL("jar:file:" + "C:\\Users\\...\\out\\artifacts\\workers_jar\\something
@FunctionalInterface
public interface IWorker {
void doStuff();
}
IWorker worker;
try {
URL[] urls = { new URL("jar:file:" + "C:\\Users\\...\\out\\artifacts\\workers_jar\\somethingworker.jar" +"!/") };
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("hu.test.worker.SomethingWorker");
worker = (IWorker) cls.newInstance();
worker.doStuff();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
软件已经使用数据库表对从模块加载的类进行了一些配置,因此如果我在那里存储完整的类名(可能还有JAR的路径),我可以使用它。我的问题是,我能不能用更好的方法?这有点难以维护,很容易损坏,而且我不知道是否可以用它加载已加载的类。以下是一些可能损坏的东西:
显然,这比这要复杂一些,但运行多个服务实例是实现高可用性的正常方法。如果您负担不起运行多个实例,那么做一些巧妙的事情来避免服务器重新启动并不能完全满足“24/7”的要求。以下是一些可能出现问题的地方:
显然,这比这要复杂一些,但运行多个服务实例是实现高可用性的正常方法。如果您负担不起运行多个实例,那么做一些巧妙的事情来避免服务器重新启动并不能完全满足“24/7”的要求。一个经典的方法是在基础架构级别而不是代码级别处理这一问题。具有两个应用程序实例的负载平衡器。若要部署新版本的软件,请从负载平衡器中删除一个实例,更新并重新启动此实例,然后将其返回LB,删除并更新第二个实例,并将其返回LB。我是否需要一些重型框架来实现此目的?如果应用程序无状态且不使用会话,比设置上面的要容易得多。否则,必须在会话同步方面付出一些努力,但这仍然是可行的。为此,您需要一个容器,如Tomcat或WebLogic,并设置一个集群环境(->负载平衡器)。好的一点是它不需要复杂的编码一个经典的方法是在基础架构级别而不是代码级别处理这个问题。具有两个应用程序实例的负载平衡器。要部署新版本的软件,请从负载平衡器中删除一个实例,更新并重新启动此实例,然后将其返回到LB,删除并更新第二个实例,并将其返回到LB。我是否需要一些重型框架来实现此目的?如果应用程序是无状态的且不使用会话,则很容易使用