我们的服务现在一直就报下面这个错误,报的还比较频繁,请大家帮帮忙。
ERROR -[org.apache.commons.modeler.Registry] (Registry.java:873) [http80-Processor21] - Error registering Catalina:type=RequestProcessor,worker=http80,name=HttpRequest4
java.lang.SecurityException: access denied (javax.management.MBeanTrustPermission register)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.checkMBeanTrustPermission(DefaultMBeanServerInterceptor.java:1725)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:342)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:505)
at org.apache.commons.modeler.Registry.registerComponent(Registry.java:871)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.init(Http11Protocol.java:514)
at org.apache.tomcat.util.net.TcpWorkerThread.getInitData(PoolTcpEndpoint.java:541)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:656)
at java.lang.Thread.run(Thread.java:534)应用服务机器环境:Linux 9.0 + jakarta-tomcat-5.0.16 + j2sdk1.4.2_02
这台机器上面我们起来4个独立的服务。
服务1:认证用(jsp/servlet)
服务2:用户用(基于struts1.1的jsp/servlet)
服务3:管理用(基于struts1.1的jsp/servlet)
服务4:sp用(基于struts1.1的jsp/servlet)
我们的业务和数据库操作封装的session bean中,在另外的机器上面,在应用层,有一个BD封装了对后台session bean的访问,四个服务用的是同一个BD,四个服务的安装是统一安装的,仅仅是目录不同而已。
现在问题出来了,服务1和服务2上面出现了上面的错误信息,服务3和服务4没有。
服务2的报错规律我们还没有掌握,倒是服务1的规律好找。
在测试机上面我们着重对服务1出现的错误进行了研究分析:
一、是配置问题吗?
我们将conf/server.xml中的
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
            debug="0"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
            debug="0"/>
注释调,不行。
在conf/catalina.policy里面加上
grant{
javax.management.MBeanTrustPermission "*","*"; 
};
grant{
javax.management.MBeanTrustPermission "*"; 
};
都不行
二、是jdk或是tomcat的问题?
是jdk的问题,应该不是,4个服务调用是同一个JDK。是tomcat吗,不管了,先换个试试,换了jakarta-tomcat-4.1.27和jakarta-tomcat-4.1.29,我要疯了,还是不行。看来还是好好调试代码吧。
三、是图片的问题?
服务1重新启动以后,用户在服务2上面第一次访问的时候,服务2发现用户没有登录,通过response.sendRedirect重定向到服务1进行认证。服务2的 AuthServlet 接到请求以后,检查cookie,发现没有,重定向到服务2的login.jsp,正常出现登录页面。这个时候控制台台上面打印了错误,加了一些调试信息,大致的错误如下:
start AuthServlet
response.sendRedirect(login.jsp)
start login.jsp
end login.jsp
end AuthServlet
Error print 。
这里面的response.sendRedirect,我们用实际上是用requestDispatcher.forward,但是不管用哪个,结果都是报错。
我们将这个response.sendRedirect(login.jsp)改为一个response.sendRedirect(error.jsp),它就不报错了,error.jsp是一个极其简单的页面,里面除了jsp头以外,什么java语句都没有。于是,我们怀疑是login.jsp里面有问题。我们把所有的java语句都去掉了,还是报错,于是我们把这个login.jsp改为login.html,里面没有任何java的语句。还是报错。我们郁闷了:这个客户端的页面要是有问题,还会影响到服务器端。我们将这个login.html分段的测试,最后将找到这个<img src="line.gif">报错,这个还会引起服务器端报错,我们不敢相信。我们把图片换成line2.gif,还是报错,换成其他的,嗨,没有问题了。难道是访问权限,我们查看了服务器端的设置,他们的权限都是644呀,没有问题;难道是文件含有非法字符,我把这段代码重新写了一遍,不行,还是报错;难道是这个文件名有问题,换成其它,换成刚才测试成功的,都不行;打开图片文件,没有发现什么异常呀,图片都是我们的设计人员做的呀,应该信得过。我们一生气,将它改为<img src="">,嘿,它还报错。我们虽然将错误定位到这里,可是我们怎么也不相信这是BUG根源,要是的话,好几百个图片,好几百个页面,谁疯了去一个图片一个图片的试。
四、不是图片的问题!
我们在正常出现登录页面第一次报错以后,页面后退,重新登录,嘿,不报了;我们先访问服务1的login.jsp,没有错,再访问AuthServlet,还是不报错;我们将服务1的重定向改为IP(原先这个里面都是域名访问),奇怪了,报了两次错误:
start AuthServlet
response.sendRedirect(login.jsp)
end AuthServlet
Error print 。
start login.jsp
end login.jsp
Error print 。五、是BD的问题?
我们肯定不是HTML的问题,也不是图片,也许是程序的问题。我们将 AuthServlet 精简,上来就调用重定向,呵呵,没有报错,是程序的问题,我们心情轻松了一些。代码一点一点的测试,最后将焦点集中在一个BD的调用上面,难道是BD的错,这个调用很简单col = bd.getAllSp(1,9999);,可是这个调用在服务3和服务4中太频繁了,他们都是用同一个BD,显然不是这个问题。
六、还是配置问题?
四个服务的开发人员不一,是不是开发中间哪些细节的配置改了。将服务1的内容挂到服务4中的环境中去,运行正常。将服务4的配置覆盖服务1,晕,牛脾气也来了。慢慢来,一个目录一个目录的覆盖。最后发现是common/lib的axis.jar要是去掉就没有问题,要是加上就报错。看看WEB-INF/lib下面也有,有些兴奋,将这个里面重复的JAR包删除,不报了。检查服务2里面common/lib目录,没有axis.jar,也没有重复的jar包呀。先不管,将线上的重复包也去掉,重新启动,看控制台:服务刚起来,就报错了。现在我要疯了