嵌入式Jetty热部署

时间:2019-04-07 16:36:34

标签: java continuous-deployment embedded-jetty jetty-9

我们有一个可以在其中运行嵌入式Jetty服务器的应用。

要求应用程序应运行服务器,稍后我们可以动态地动态部署新的WAR文件(无需API调用等)。

如果您使用非嵌入式版本,此行为非常简单-只需将WAR文件推送到webapp目录中,其余的工作就会完成,我正在尝试对嵌入式版本进行类似的操作。

到目前为止,我已经看到了一些建议:

  1. Jetty 9 (embedded): Adding handlers during runtime-但它要求我编写cron来每x秒触发一次任务,然后扫描本地目录以查找更改,显然,我还必须检查是否删除和更新现有的WAR。听起来似乎并不复杂,但是我在Jetty中发现了一些应该完全做到这一点的类(请参阅选项2)

  2. DeploymentManager类与ScanningAppProvider一起使用,它们假定以固定的间隔扫描文件夹中的更改并相应地加载应用程序。 起初这听起来很有希望,但是我不确定如何将服务器绑定到Deployment Manager。关于它的文件似乎很少,而我真正要的是什么。我将在下面共享我的代码以提供一些上下文

公共类JettyServerDeploymentManager实现JettyServer {

private Server server;

public void start() throws Exception {
    server  = new Server(8090);

    ServerConnector connector = new ServerConnector(server);
    server.setConnectors(new Connector[] {connector});

    DeploymentManager deploymentManager = new DeploymentManager();
    AppProvider appProvider = appProvider();
    appProvider.setDeploymentManager(deploymentManager);
    deploymentManager.setAppProviders(Collections.singletonList(appProvider));

    server.start();
    server.join();
}

public AppProvider appProvider() throws IOException, URISyntaxException {
    ScanningAppProvider appProvider =  new ScanningAppProvider(filenameFilter()) {
        public ContextHandler createContextHandler(App app) {
            return null;  // Still checking this part
        }
    };

    appProvider.setScanInterval(1);
    appProvider.setMonitoredDirResource(new PathResource(findWebAppPath()) {
    });

    return appProvider;
}

public FilenameFilter filenameFilter(){
    return new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return true;  // Accept all files
        }
    };
}



private static URL findWebAppPath() {
    ClassLoader classLoader = SparkApp.class.getClassLoader();
    return classLoader.getResource("myapp");
}

}

我很高兴能获得一些指导,因为这是我第一次使用Jetty,第二种方法有效吗?似乎是我所需要的,但我不确定是否值得解决这个问题,就现在看来,编写cron任务与配置Deployment Manager相比听起来并不算复杂,但是我可能会遗漏一些东西

我还有2个更具体的问题:

a。在非嵌入式版本中,我可以在不提供上下文或处理程序的情况下加载Jetty服务器,为什么与嵌入式版本不一样? (上面的代码引发并出错-java.lang.NullPointerException:初始化DeploymentManager时,没有为App ...创建任何处理程序)。如果我想要一个不包含任何处理程序的嵌入式码头(就像非嵌入式版本一样)

b。在第二种方法中-如何将服务器绑定到DeploymentManager?在任何一个对象上都没有设置server \ deployment-manager。

0 个答案:

没有答案