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

时间:2014-04-04 00:07:52

标签: java jetty jmx servlet-filters managed-bean

我为我的webapp设置了一个DoSFilter,并将其部署在Jetty中。事情很顺利。但是我偶尔会想要更改过滤器配置。为此,我总是需要更改web.xml并重新部署webapps,这是相当不方便的。我想要动态地这样做。

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

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

  1. 配置jetty以启用jmx和jmxremote。我成功地使用jconsole连接到jetty jvm。
  2. 在我的部署描述符中,我有一个如下定义的过滤器
  3. <filter> <filter-name>DoSFilter</filter-name> <filter-class>org.eclipse.jetty.servlets.DoSFilter</filter-class> <init-param> <param-name>maxRequestsPerSec</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>requestPort</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>maxRequestMs</param-name> <param-value>600000</param-value> </init-param> <init-param> <param-name>excludePatterns</param-name> <param-value>/healthCheck</param-value> </init-param> <init-param> <param-name>managedAttr</param-name> <param-value>true</param-value> </init-param> </filter>

    managedAttr param设置为true,以便将此过滤器添加到ServletContext,从而将其公开为MBean。

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

    <context-param> <param-name>org.eclipse.jetty.server.context.ManagedAttributes</param-name> <param-value>DoSFilter</param-value> </context-param>

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

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

    请指教。我在这里做错了吗?

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

    <servlet> <servlet-name>capture</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

    由于

    更新:我尝试在嵌入式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
    

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。问题出在我相信的罐子里。我在检查之前扩展了DOSFilter来替换一些头文件,所以我必须在我的webapp中包含servlets jar。我在我的WEB-INF / lib文件夹中有一大堆其他的jetty - * .jar(对于其他一些调试purporse),它在某种程度上造成了冲突。 webapp是一个maven项目,所以我在我的webapp中添加提供给所有基于jetty的模块,这样这些jar就不会被包装到我的可部署战争中。这解决了这个问题。