以编程方式配置嵌入式 undertow 服务器

Posted

技术标签:

【中文标题】以编程方式配置嵌入式 undertow 服务器【英文标题】:configure embedded undertow server programmatically 【发布时间】:2016-01-30 13:07:19 【问题描述】:

下面的代码允许我创建一个嵌入式 undertow servlet 服务器,我在设置连接器设置的“最大参数”时遇到问题,我理解它的方式通常是通过 xml 文件配置的。

   public static String initCustomServer_(Servlet servlet,int preferedPort,String servletName,String[] resourceList,String... domainName)
    String contextURL = null;
    int curPort = preferedPort==-1?9001:preferedPort;
    boolean initServ = false;
    System.out.println("====servlet running in local mode====");
    while(!initServ) 
        try
            io.undertow.servlet.api.DeploymentInfo servletBuilder = io.undertow.servlet.Servlets.deployment()
                    .setClassLoader(servlet.getClass().getClassLoader())
                    .setContextPath(domainName.length==0?"/":"/"+domainName[0])
                    .setDeploymentName("test.war")
                    .addServlets(
                            io.undertow.servlet.Servlets.servlet(servletName, servlet.getClass()).addMapping("/"+servletName)
                    )
                    .setResourceManager(new io.undertow.server.handlers.resource.FileResourceManager(new File("src/dss_core/html5/webapp"), 1));

            io.undertow.servlet.api.DeploymentManager manager = io.undertow.servlet.Servlets.defaultContainer().addDeployment(servletBuilder);

            manager.deploy();

            io.undertow.server.HttpHandler servletHandler = manager.start();
            io.undertow.server.handlers.PathHandler path = io.undertow.Handlers.path(io.undertow.Handlers.redirect(domainName.length==0?"/":"/"+domainName[0]))
                    .addPrefixPath(domainName.length==0?"/":"/"+domainName[0], servletHandler);

            io.undertow.Undertow server = io.undertow.Undertow.builder()
                    .addHttpListener(curPort, "localhost")
                    .setHandler(path)
                    .build();

            server.start();
            initServ = true;
            contextURL = "http://localhost:"+curPort+(domainName.length==0?"":"/"+domainName[0])+"/"+servletName;
         catch (Exception ex) 
            //creation of server at certain port fails therefore try again on another port
            System.err.println(" server unable to initialize :" + ex.getMessage());
            ex.printStackTrace();
            curPort++;
        
    
    return contextURL;

我如何通过嵌入式 java 代码更改诸如“最大参数”之类的配置,而不是使用像下面这样的 xml?

           <server name="default-server">
            <http-listener name="default" socket-binding="http" max-parameters="5000"/>

发现 here 是我可以通过 xml 配置的东西的列表,我如何通过 java 代码设置它们?

更新 1:是的,在 io.undertow.UndertowOptions 中找到了一些选项,但由于它被声明为最终选项,所以这不起作用,现在怎么办?

io.undertow.UndertowOptions.MAX_PARAMETERS = 10000;

【问题讨论】:

【参考方案1】:

经过数小时的研究和反复试验,我终于明白了,我的第一个想法是简单地获取代码并自己编译,不利的一面是我必须下载所有源代码然后编译它,例如事实证明有些麻烦,在看到无尽的依赖关系和数小时的源代码下载后,我决定退出。配置服务器看起来像这样

                io.undertow.Undertow server = io.undertow.Undertow.builder()
                    .addHttpListener(curPort, "localhost")
                    .setHandler(path)
                    .setServerOption(io.undertow.UndertowOptions.MAX_PARAMETERS, 10000)
                    .setServerOption(io.undertow.UndertowOptions.OPTION2, Value2)
                    .build();

setServerOption 方法和io.undertow.UndertowOptions 类终于有意义了,可惜undertow 不是很流行,也没有太多示例代码,我希望我能帮助任何希望走undertow 嵌入式道路的人

【讨论】:

以上是关于以编程方式配置嵌入式 undertow 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Undertow 嵌入式服务器中登录文件?

以编程方式在 Wildfly/Undertow 中创建虚拟主机

如何配置 Undertow 以将字符集添加到文本/内容类型?

嵌入式 Undertow 日志输出

基于guiceresteasymybatis和undertow实现的轻量级restful服务

jetty:如何以编程方式配置多个虚拟主机?