【问题标题】:Jetty: Pass object from main method with WebAppProvider to ServletJetty:将对象从带有 WebAppProvider 的主方法传递给 Servlet
【发布时间】:2023-03-29 23:20:02
【问题描述】:

我需要在 main 方法中从嵌入式码头代码中传递一个对象,以便在 servlet 中使用。

这是一个问题,因为 WebAppContext 中使用了单独的类加载器 - 否则我只会使用静态变量。

我的主要代码是这样设置的:

Server server = new Server(); 
// setup connectors here...
ContextHandlerCollection contexts = new ContextHandlerCollection();
RequestLogHandler requestLogHandler = new RequestLogHandler();
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] { contexts, new DefaultHandler(), requestLogHandler });
server.setHandler(instrumentedHandler(handlers, metrics));

addRequestLogging(requestLogHandler);

DeploymentManager deploymentManager = new DeploymentManager();
deploymentManager.setContexts(contexts);

WebAppProvider webAppProvider = new WebAppProvider();
webAppProvider.setMonitoredDirName(jettyHome + "/webapps");
webAppProvider.setParentLoaderPriority(false);
webAppProvider.setExtractWars(true);
webAppProvider.setScanInterval(1);
webAppProvider.setDefaultsDescriptor(jettyHome + "/webdefault.xml");
webAppProvider.setConfigurationManager(new PropertiesConfigurationManager());

deploymentManager.addAppProvider(webAppProvider);
server.addBean(deploymentManager);
// Attempt to set the metrics on the server - but I can't access them in the Servlet
server.setAttribute(MetricRegistry.class.getName(), metrics);
server.start();
server.join();

我从question 中尝试了一些东西,但没有奏效。具体来说,servlet 上下文中没有设置org.eclipse.jetty.server.Server 属性。

(具体来说,我正在尝试在码头对象上设置 dropwizard 指标,但我的应用程序的其余部分需要相同的 MetricRegistry 对象,以便我可以将所有指标和报告器放在一起)

【问题讨论】:

    标签: embedded-jetty jetty-9


    【解决方案1】:

    使用DeploymentManager 时,您在主启动代码期间无法访问WebAppContextServletContextHandlerContextHandler

    您将不得不使用DeploymentManager 中的工具来提供自定义AppLifeCycle.Binding,它可以在部署阶段完成您需要它做的事情。

    好处是这在热(重新)部署期间也有效。

    这是来自embedded-jetty-cookbook的嵌入式码头中此设置的工作示例

    DeployWebApps.java

    package org.eclipse.jetty.cookbook;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.eclipse.jetty.deploy.App;
    import org.eclipse.jetty.deploy.AppLifeCycle;
    import org.eclipse.jetty.deploy.DeploymentManager;
    import org.eclipse.jetty.deploy.graph.Node;
    import org.eclipse.jetty.deploy.providers.WebAppProvider;
    import org.eclipse.jetty.server.Handler;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.handler.ContextHandler;
    import org.eclipse.jetty.server.handler.ContextHandlerCollection;
    import org.eclipse.jetty.server.handler.DefaultHandler;
    import org.eclipse.jetty.server.handler.HandlerCollection;
    
    public class DeployWebApps
    {
        public static void main(String[] args) throws Exception
        {
            Server server = new Server(8080);
    
            ContextHandlerCollection contexts = new ContextHandlerCollection();
            HandlerCollection handlers = new HandlerCollection();
    
            handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()});
    
            server.setHandler(handlers);
    
            Path confFile = Paths.get(System.getProperty("user.dir"), "example.conf");
    
            ContextAttributeCustomizer contextAttributeCustomizer = new ContextAttributeCustomizer();
            contextAttributeCustomizer.setAttribute("common.conf", confFile);
    
            DeploymentManager deploymentManager = new DeploymentManager();
            deploymentManager.setContexts(contexts);
            deploymentManager.addLifeCycleBinding(contextAttributeCustomizer);
    
            String jettyBaseProp = System.getProperty("jetty.base");
            if (jettyBaseProp == null)
            {
                throw new FileNotFoundException("Missing System Property 'jetty.base'");
            }
            Path jettyBase = new File(jettyBaseProp).toPath().toAbsolutePath();
    
            WebAppProvider webAppProvider = new WebAppProvider();
            webAppProvider.setMonitoredDirName(jettyBase.resolve("webapps").toString());
    
            deploymentManager.addAppProvider(webAppProvider);
            server.addBean(deploymentManager);
    
            // Lets dump the server after start.
            // We can look for the deployed contexts, along with an example of the
            // result of ContextAttributesCustomizer in the dump section for "Handler attributes"
            server.setDumpAfterStart(true);
            server.start();
            server.join();
        }
    
        public static class ContextAttributeCustomizer implements AppLifeCycle.Binding
        {
            public final Map<String, Object> attributes = new HashMap<>();
    
            public void setAttribute(String name, Object value)
            {
                this.attributes.put(name, value);
            }
    
            @Override
            public String[] getBindingTargets()
            {
                return new String[]{ AppLifeCycle.DEPLOYING };
            }
    
            @Override
            public void processBinding(Node node, App app) throws Exception
            {
                ContextHandler handler = app.getContextHandler();
                if (handler == null)
                {
                    throw new NullPointerException("No Handler created for App: " + app);
                }
                attributes.forEach((name, value) -> handler.setAttribute(name, value));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2011-09-27
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多