使用Tomcat6初始化JPOS Q2

时间:2014-09-19 08:41:06

标签: java tomcat jpos

我们正在使用带有Q2的jpos,并在tomcat6上部署了我们的一个webapp,这一切都很好。现在我们必须使用q2实现另一个jpos应用程序但是当我们将它部署在同一个tomcat6服务器上时,它没有加载对象,例如QMUXChannelAdaptor等。我注意到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。

问题

现在问题是我不确定我在处理什么不知道MBeanServer是什么,因为我的背景是.Net。所以问题是;将上述变更纳入生产是否安全?

1 个答案:

答案 0 :(得分:1)

Q2是一个独立的应用程序,虽然它可以嵌入到其他应用程序中,但99%的部署和主要开发重点都针对独立设置,因此您可能会在运行时发现(正如您所做的)一些粗糙的边缘它在容器中。

尽管如此,我们了解您的问题并已在jPOS 1.9.9-SNAPSHOT中解决了该问题,详情请见2dbd8deChangeLog