如何限制对 JMX 属性的访问
How limit access to JMX attributes
我们的应用程序需要限制用户访问给定 MBean 的 JMX 属性和操作的子集。例如C3P0 MBean 公开了很多 attributes/operations。假设我们不希望用户更改最小池大小。因此,我们想在 JMX 控制台中抑制该属性的 setter。
查看 Spring 文档,我认为这是可能的:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jmx.html
下面是我与 Hibernate MBean 的约会:
<bean id="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService">
<property name="statisticsEnabled" value="true" />
<property name="sessionFactory" value="#{myEntityManagerFactory.sessionFactory}" />
</bean>
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
<bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="server" ref="mbeanServer" />
<property name="beans">
<map>
<entry key="Hibernate:name=hibernateStatistics" value-ref="hibernateStatisticsMBean" />
</map>
</property>
<property name="assembler">
<bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
<property name="managedMethods">
<list>
<value>clear</value>
</list>
</property>
</bean>
</property>
</bean>
我希望在 JMX 控制台中只显示 Hibernate MBean 的清晰方法。然而,上面的配置公开了所有原始的 Hibernate MBean 方法。
其次,C3P0 Mbean是默认暴露的,我不需要Spring bean来暴露它。该 MBean 在控制台中显示为 "PooledDataSource[2spw3u98bqgqeg1697gnx|73302995]"。我不确定只公开该 MBean 的一部分属性和操作的正确方法是什么。
感谢您的help/pointers。谢谢
如果 bean 是 "true" MBean(实现 <class>MBean
),则它按原样导出。公开的 attributes/operations 是该 MBean 的开发人员想要的。
如果根据 JMX 规范它还不是 MBean,MBeanInfoAssembler
仅用于为 bean 构造 ModelMBean
。
您可以编写自己的 bean,仅将要公开的方法委托给 hibernateStatisticsMBean
。
根据您的描述,C3PO 似乎在 Spring 之外注册了自己的 MBean,因此如果不深入研究他们的代码以查看是否有某种方法可以禁用导出,您就无法在那里做任何事情,并且,再次使用委托 MBean。
我们的应用程序需要限制用户访问给定 MBean 的 JMX 属性和操作的子集。例如C3P0 MBean 公开了很多 attributes/operations。假设我们不希望用户更改最小池大小。因此,我们想在 JMX 控制台中抑制该属性的 setter。
查看 Spring 文档,我认为这是可能的:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jmx.html
下面是我与 Hibernate MBean 的约会:
<bean id="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService">
<property name="statisticsEnabled" value="true" />
<property name="sessionFactory" value="#{myEntityManagerFactory.sessionFactory}" />
</bean>
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
<bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="server" ref="mbeanServer" />
<property name="beans">
<map>
<entry key="Hibernate:name=hibernateStatistics" value-ref="hibernateStatisticsMBean" />
</map>
</property>
<property name="assembler">
<bean class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">
<property name="managedMethods">
<list>
<value>clear</value>
</list>
</property>
</bean>
</property>
</bean>
我希望在 JMX 控制台中只显示 Hibernate MBean 的清晰方法。然而,上面的配置公开了所有原始的 Hibernate MBean 方法。
其次,C3P0 Mbean是默认暴露的,我不需要Spring bean来暴露它。该 MBean 在控制台中显示为 "PooledDataSource[2spw3u98bqgqeg1697gnx|73302995]"。我不确定只公开该 MBean 的一部分属性和操作的正确方法是什么。
感谢您的help/pointers。谢谢
如果 bean 是 "true" MBean(实现 <class>MBean
),则它按原样导出。公开的 attributes/operations 是该 MBean 的开发人员想要的。
如果根据 JMX 规范它还不是 MBean,MBeanInfoAssembler
仅用于为 bean 构造 ModelMBean
。
您可以编写自己的 bean,仅将要公开的方法委托给 hibernateStatisticsMBean
。
根据您的描述,C3PO 似乎在 Spring 之外注册了自己的 MBean,因此如果不深入研究他们的代码以查看是否有某种方法可以禁用导出,您就无法在那里做任何事情,并且,再次使用委托 MBean。