同一服务器上的许多应用程序具有相同的 JMX Mbean 类
我有超过 5 个 Spring Web 应用程序,它们都在使用另一个通用库。这个公共库有它自己的 MBean。由于强制的唯一 objectName 约束,我的应用程序无法部署在同一服务器上。
我使用 MBean 的方式是这样的:
@ManagedResource(objectName = "com.org.city:name=City", description = "City related operations")
我想为所有应用程序使用具有不同 objectNames 的相同 MBean 类。在不重复我的 MBean 的情况下使用它的正确方法是什么?
谢谢
I have more than 5 spring web application and all of them are utilizing another common library. This common library has its own MBeans. Because of mandatory unique objectName constraint, my applications could not be deployed on same server.
The way I am using MBeans are like this:
@ManagedResource(objectName = "com.org.city:name=City", description = "City related operations")
I would like to use same MBean class with different objectNames for all applications. What is the correct way to utilize it without duplicating my MBeans.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我遇到了同样的问题,并基于 Cemo 的解决方案构建。这是一个示例实现。
context.xml
MultiAppMetadataNamingStrategy.java
这允许设置一个 mbean,如下所示:
它将使用对象名称注册一个 mbean
com.foo:name=myBean,type=MyBean,app=CustomAppName
I ran into the same issue, and built off of Cemo's solution. Here is a sample implementation.
context.xml
MultiAppMetadataNamingStrategy.java
This allows setting up an mbean like:
which will register an mbean with object name
com.foo:name=myBean,type=MyBean,app=CustomAppName
我已经为自定义行为实现了 ObjectNamingStrategy。
I have implemented ObjectNamingStrategy for custom behaviour.
您需要更改 mbean 导出器的注册行为:
但这仍然意味着只有一个应用程序注册该 bean。从逻辑上讲,您不能在多个应用程序中拥有多个同名的 mbean。如何确定调用哪个应用程序?使用应用程序名称作为 mbean 名称的前缀。
You need to change the registering behavoiur of the mbean exporter:
But this will still mean only one application registers the bean. And you can't logically have more than one mbean with the same name from multiple applications. How will be determined which application to invoke? Use the application name as a prefix to the mbean name.
您可以使用占位符根据属性定义简单的命名策略。
每场战争都会有它自己的 app.properties 副本
例如,
使用属性文件:app.properties
和 PropertiesPlaceHolder
定义 objectName
您的 bean 将被命名
您可以使用多个属性占位符。
适用于 Spring 4.0.2
You can define a simple naming strategy based on properties using place holder(s).
Every war will have it;s own copy of the app.properties
E.g.
With a properties file :app.properties
and a PropertiesPlaceHolder
Defining objectName
Your bean will be named
You can use more the one property place holder.
Works with Spring 4.0.2
这些答案帮助我指明了正确的方向,但是基于注释的设置缺少一些内容(但是我没有使用 Spring Boot)
关于此主题的 Spring 文档 说:
但是使用 @EnableMBeanExport 会阻止您定义自己的 NamingStrategy 的能力,
所以不要只设置一个返回我的
@Bean
方法>MBeanExporter 具有使用上下文路径的自定义命名策略。These answers helped point me in the right direction, but there were a few pieces missing for an Annotation based setup (I'm not using Spring Boot however)
The Spring Docs on this subject say:
But using
@EnableMBeanExport
prevents you from having the ability of defining your ownNamingStrategy
So Instead of just setup a
@Bean
method that returns myMBeanExporter
with a custom naming strategy that uses the context path.