Java Jetty:如何使用JMX配置DoSFilter参数

Java Jetty:如何使用JMX配置DoSFilter参数,java,jetty,jmx,servlet-filters,managed-bean,Java,Jetty,Jmx,Servlet Filters,Managed Bean,我已经为我的webapp设置了DoSFilter,并将其部署在Jetty中。事情进展顺利。但是,我偶尔想更改过滤器配置。要做到这一点,我总是必须更改web.xml并重新部署webapps,这相当不方便。我希望动态地执行此操作 我了解到我可以使用JMX配置QoSFilter和DoSFilter,因为它们在Jetty中作为MBean公开。我做同样的事有困难 到目前为止,我已经能够做到以下几点: 配置jetty以启用jmx和jmxremote。我成功地使用jconsole连接到jetty jvm 在部

我已经为我的webapp设置了DoSFilter,并将其部署在Jetty中。事情进展顺利。但是,我偶尔想更改过滤器配置。要做到这一点,我总是必须更改web.xml并重新部署webapps,这相当不方便。我希望动态地执行此操作

我了解到我可以使用JMX配置QoSFilter和DoSFilter,因为它们在Jetty中作为MBean公开。我做同样的事有困难

到目前为止,我已经能够做到以下几点:

  • 配置jetty以启用jmx和jmxremote。我成功地使用jconsole连接到jetty jvm
  • 在部署描述符中,我定义了一个过滤器,如下所示
  • 
    滤光片
    org.eclipse.jetty.servlets.DoSFilter
    maxRequestsPerSec
    2.
    请求端口
    符合事实的
    最大请求数
    600000
    排除模式
    /健康检查
    管理数据
    符合事实的
    

    managedAttr参数设置为true,以便将此筛选器添加到ServletContext,从而将其作为MBean公开

    3我还添加了一个上下文参数,要求jetty将DoSFilter作为MBean,如下所示

    
    org.eclipse.jetty.server.context.ManagedAttributes
    滤光片
    

    现在这是可行的,但不是我想要的方式。当我打开Jconsole并转到MBeans选项卡时,我可以在org.eclipse.jetty.servlets.DoSFilter下看到DoSFilter

    然而,当我沿着树向下移动时,我只能看到该MBean的元数据信息。没有附加到该MBean的属性或操作,我无法更改任何内容

    请告知。我做错什么了吗

    我的webapp是一个spring应用程序,只定义了一个servlet

    
    俘虏
    org.springframework.web.servlet.DispatcherServlet
    1.
    

    谢谢

    更新:我试着在嵌入式Jetty中配置它,结果一切正常。但我仍然无法在独立部署中实现这一点

    下面是我如何测试嵌入式服务器的

    public static void main(String[] args) throws Exception {
            Server server = new Server();
            Connector connector = new ServerConnector(server);
            server.addConnector(connector);
            MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
            MBeanContainer mbeanContainer = new MBeanContainer(mbeanServer);
            server.addBean(mbeanContainer);
    
      WebAppContext context = new WebAppContext(server,"/home/neo/ideaprojects/helloworld/src/main/webapp/", "/");
    
    
            DoSFilter filter = new DoSFilter();
            FilterHolder holder = new FilterHolder(filter);
            String name = "DosFilter";
            holder.setName(name);
            holder.setInitParameter("managedAttr", "true");
    
            context.setInitParameter(ServletContextHandler.MANAGED_ATTRIBUTES, name);
            context.addFilter(holder, "/*", EnumSet.of(DispatcherType.FORWARD));
            // ----------------------------------------
    
            server.start();
            server.join();
        }
    
    更新

    I see the following debug logs in jetty standalone mode
    2014-04-05 20:18:32.834:DBUG:oejj.MBeanContainer:main: beanAdded o.e.j.w.WebAppContext@ace3c1b{/,file:/tmp/jetty-0.0.0.0-8080-ROOT.war-_-any-6506776307143437350.dir/webapp/,STARTING}{/ROOT.war}->org.eclipse.jetty.servlets.DoSFilter@6d4d63ba
    2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: ObjectMbean: mbeanFor org.eclipse.jetty.servlets.DoSFilter@6d4d63ba mClass=class org.eclipse.jetty.jmx.ObjectMBean
    2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: mbeanFor org.eclipse.jetty.servlets.DoSFilter@6d4d63ba is org.eclipse.jetty.jmx.ObjectMBean@34bb5def
    2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: No MBean Influence for DoSFilter
    2014-04-05 20:18:32.835:DBUG:oejj.ObjectMBean:main: No MBean Influence for Object
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: No MBean Influence for Filter
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influence Count: 3
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: No @ManagedObject declared on class org.eclipse.jetty.servlets.DoSFilter
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: org.eclipse.jetty.servlets.DoSFilter
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: org.eclipse.jetty.servlets.DoSFilter
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: java.lang.Object
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: java.lang.Object
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Influenced by: javax.servlet.Filter
    2014-04-05 20:18:32.836:DBUG:oejj.ObjectMBean:main: Annotations not found for: javax.servlet.Filter
    2014-04-05 20:18:32.836:DBUG:oejj.MBeanContainer:main: Registered org.eclipse.jetty.servlets:context=ROOT,type=dosfilter,id=0
    

    我发现了问题。我相信问题出在罐子上。在检查之前,我扩展了DOSFilter以替换一些头,因此我必须在我的webapp中包含servlet jar。我的WEB-INF/lib文件夹中也有一大堆其他jetty-*.jar(用于其他调试目的),它们不知何故造成了冲突。webapp是一个maven项目,所以我在webapp中添加了所有基于jetty的模块,这样这些jar就不会被打包到我的可部署war中。这就解决了问题