我目前正在进行http://truevfs.java.net,一个用于Java的虚拟文件系统。TrueVFS是模块化的,使用插件架构在运行时加载功能,无需配置任何东西。一些可选插件使用平台MBeanServer注册具有定义的对象名的MBean,以进行监视和管理。
现在,我的一些用户正在将TrueVFS JAR捆绑在他们的WAR中以部署到Tomcat等人。除非他们包含一个启用JMX的插件并在不同的上下文中部署多个WAR实例,否则这很好。
这不起作用,因为每个web应用程序都有自己的支持JMX的插件的类加载器定义,但它们都将共享相同的平台MBeanServer,并使用相同的对象名来注册它们的MBean,因此存在冲突。
现在我该如何解决这个问题?我已经抽象了MBeanServer查找,以便我可以将其提取到另一个插件中,但是我无法确定我应该使用哪个MBeanServer来注册我的MBean的普遍适用的策略。
我搜索了这个主题,找到了一些WebLogic的留档,这表明我应该使用JNDI查找MBeanServer。然而,这似乎是特定于WebLogic的。
难道没有一种通用的一刀切的方法吗?
更新:
以下是使用附加属性来标识Web应用定义的类加载器的快速概念验证:
import java.lang.management.ManagementFactory;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.ObjectName;
public class Messenger implements MessengerMXBean {
private static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
public static void main(String[] args ) throws Exception {
register("one");
register("two");
find();
System.out.println("Waiting for interrupt...");
Thread.sleep(Long.MAX_VALUE);
}
private static void register(String context) throws Exception {
mbs.registerMBean(new Messenger(),
new ObjectName(":type=Messenger,context=" + context));
}
private static void find() throws Exception {
for (ObjectName name : mbs.queryNames(new ObjectName(":type=Messenger,*"), null))
System.out.println(JMX.newMXBeanProxy(mbs, name, MessengerMXBean.class).getMessage());
}
public String getMessage() { return "Hello world!"; }
}
public interface MessengerMXBean { String getMessage(); }
不出所料,该程序注册了两个Messenger MBean,找到它们并打印它们的“Hello world!”消息。
然而,这种解决方案有缺点:
这些都是严重的限制,但似乎我没有更好的选择,所以我可能会这样做。
您可以为每个war模块重新创建一个新的MBeanServer。但是,从JSR-160客户端外部查询它们时,您还需要指定MBeanServer。
使用Jolokia时,JVM的所有MBeanServer都会透明地合并。然而,当您有具有相同名称的MBean时,这在这里也没有帮助,因为只有一个MBean可以访问。
我针对这种情况的解决方案是使用相同的MBeanServer,但使用不同名称的MBean。您可以为这些MBean使用完全正交的域,或者除了其他属性之外,在名称中添加一个额外的“限定符”键值对。当我期望典型情况下只有一个MBean时,我首先尝试使用固定名称添加MBean。如果失败,我会在名称中添加另一个限定符=…“部分,其中包含一个自动生成的值,该值可以由某些值(如WAR名称)唯一标识,甚至是一个可配置的值。
事实上,从客户机的角度来看,处理多个MBeanServer确实是一件痛苦的事情,因此使用JMX作为具有唯一(可能部分生成MBean名称)的全局名称空间是一个简单的选择。
问题内容: 我一直在尝试通过Maven 集成在GlassFish V3中部署Java 。虽然我发现了一些插件,但它们看起来都不是很活跃: Maven Glassfish插件 Eskato在Maven上的Wordpress博客 而且我从Eskato的Blog中获得了最多的信息,该博客写于2008年3月,所以我不知道GlassFish Maven集成的状态如何,也找不到适合的插件。使用Maven Gl
问题内容: 在GF或Tomcat之前使用Apache Webserver是个好主意吗?它会提高性能/安全性吗? 还是没有任何理由将Apache Web Server与GF一起使用? 问题答案: 取自https://cwiki.apache.org/confluence/display/TOMCAT/Connectors#Connectors-Q3 聚类。通过使用Apache HTTP作为前端,您可
我们最近切换到了 Glassfish 3.1.2.2,并有几个 Web 应用程序打包为 war 文件。有时,这些应用程序所需的上下文根目录与文件名不同。 当我们使用Weblogic时,我们通过在Weblogic中声明上下文根来实现这一点。像这样的xml 我们注意到glassfish-web.xml中存在相同的标记,但是不管我们在那里定义什么,服务器总是将文件名确定为上下文根。 现在我们在 asad
问题内容: eclipse与weblogic配合使用的推荐插件是什么?具体来说,我需要使用旧版本的weblogic 8.1,但是我可以使用任何版本的Ecplise。我想调试应用程序并设置断点等。 我更大的任务是将项目移至Jboss,我是否可以在Eclipse中的两个应用服务器上部署相同的应用,大概需要2套配置文件,等等,有什么建议吗?2个独立的项目? 问题答案: 如果将Eclipse与WTP一起使
我有一个EAR项目,由3个模块/项目组成:WEB、EJB和JPA。在WEB项目中,我添加了log4j2用于日志记录。因此,我将log4j2.xml文件放入webcontent/web-inf/direcotry。 当我只部署一个项目(例如开发人员版本)时,所有工作都很好。然而,当im部署这两个项目时,它们都将日志记录到同一个文件(它始终是从首先部署的项目在log4j2中配置的文件)。我的Glass
问题内容: 我正在使用JSLint来遍历JavaScript,并且在执行诸如在语句内部进行比较之类的操作时,它返回许多建议以(三个等号)替换==(两个等号)。 有没有性能优势,以代替用? 由于存在许多比较运算符,因此任何性能改进都将受到欢迎。 如果没有进行类型转换,性能会超过==? 问题答案: 身份()运算符的行为与相等()运算符相同,但不进行任何类型转换,并且类型必须相同才能被视为相等。 进行任