我们将 jpos 与Q2
部署在 tomcat6 上的 web 应用程序之一一起使用,一切都很好。现在我们必须使用 q2 的东西实现另一个 jpos 应用程序,但是当我们将它部署在同一个 tomcat6 服务器上时,它没有加载对象,例如QMUX
等ChannelAdaptor
。我注意到在 tomcat 输出日志中出现以下异常
javax.management.InstanceAlreadyExistsException: Q2:type=system,service=loader
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:453)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.internal_addObject(DefaultMBeanServerInterceptor.java:1484)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:963)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:917)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:312)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:482)
at org.jpos.q2.Q2.run(Q2.java:150)
at java.lang.Thread.run(Thread.java:662)
您可以看到异常的来源是Q2
类,当我下载源代码时,我注意到run
方法中的代码如下。
ArrayList mbeanServerList = MBeanServerFactory.findMBeanServer(null);
if (mbeanServerList.isEmpty()) {
server = MBeanServerFactory.createMBeanServer (JMX_NAME);
} else {
server = (MBeanServer) mbeanServerList.get(0);
}
所以我决定将 jpos 源代码包含到项目中,用以下代码替换上面的代码(注意注释代码),一切都按预期开始工作。
//ArrayList mbeanServerList = MBeanServerFactory.findMBeanServer(null);
//if (mbeanServerList.isEmpty()) {
server = MBeanServerFactory.createMBeanServer (JMX_NAME);
//} else {
// server = (MBeanServer) mbeanServerList.get(0);
//}
请注意,在修改后的代码中,我不再测试我们是否已经有 MBeanServer 可用,或者是否只是创建新的。
问题
现在的问题是我不完全确定我在处理什么,不知道 MBeanServer 的用途是什么,因为我的背景是 .Net。所以问题是;将上述更改用于生产是否安全?