本来感觉是很理所当然的事情,那就是Bean要实现Remote或者Local借口,但是EJB规范里面并没有这个要求,只要Bean里面实现了Remote和Local里面定义的方法,方法签名完全一致,我所经历的所有的项目都是这样的。现在为另外一个项目做东西,在检查一些代码调用的时候发现跟踪不到,结果发现就是因为Bean没有实现接口,开始还笑话他们,后来google了下,发现原来是自己错了。不过实现接口也有好处,可以进行编译期检查约束。
本来感觉是很理所当然的事情,那就是Bean要实现Remote或者Local借口,但是EJB规范里面并没有这个要求,只要Bean里面实现了Remote和Local里面定义的方法,方法签名完全一致,我所经历的所有的项目都是这样的。现在为另外一个项目做东西,在检查一些代码调用的时候发现跟踪不到,结果发现就是因为Bean没有实现接口,开始还笑话他们,后来google了下,发现原来是自己错了。不过实现接口也有好处,可以进行编译期检查约束。
这个东东其实以前就想到要找的,但是那个时候使用了比较重量级的解决方案:JBoss的Embedded container,主要用于单元测试,我们的代码难于单元测试,原因就是对JNDI的严重依赖,以及JNDI Server必须启动,而JNDI服务是JBoss提供的。
现在找到的这个东东就是轻量级的JNDI Server,而且提供In Memory的工作方式,单元测试代码可以修改name对应的返回对象是什么,这样单元测试代码就可以很容易测试了。
网址:
http://osjava.org/simple-jndi/
这段时间在公司听到的,我想大部分的人都不会遇到,有次可见糟糕的代码风格会导致什么问题。
第一个是JSP太复杂了,包含了很多的JSP,最后为了修改一个BUG,增加了另外一个小JSP,结果发现JSP编译出错,出错原因是方法体超过64K,不可思意吧。
第二个是方法参数太多,也是一个人为了修正一个BUG,需要增加两个参数,结果加了以后发现编译不过,原因是JAVA只能允许255个参数,而那个方法原来就定义了254个参数,后来的方法是把要增加的两个方法丢到一个Collection。
呵呵,天下之大,无奇不有。
发现连接池泄露后,使用JMX-Console,搜索服务CacheConnectionManager,调用
这样我们就可以得到当前使用的连接池的线程堆栈,很容易就可以知道哪个地方存在数据库连接泄露了。
这个好像是JDK1.6里面新推出的,和JBoss的JMX-Console的功能类似,只是这个是GUI的,而且需要远程的服务器启动一些服务,在应用服务器的启动中修改以下配置(就是修改JAVA_OPTS):
-Djboss.platform.mbeanserver -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Google了下,发现很多人遇到这个问题,但是和我的都不太一样,我是启动Jboss里面运行的代码没有问题,但是写的单元测试的代码会遇到这个问题,后来想起来我们启动Jboss的时候自定义了XML的解析器,把运行单元测试的那个东东如法炮制,问题解决
今天遇到这个问题都快崩溃了,那个方法明明定义了,在JSP中用反射拿到类声明的全部方法并打印出来都可以看到的,但是修改回来后就是编译不过。
Google了下,也是很多人遇到,但是没有人解决,有人说是tomcat的问题,不太相信。
突然想到我的工程是hot deploy的,那个class有两份,一份新的一份旧的,jboss的tomcat在编译那个JSP时用的是旧的类,运行时用的是我Hot deploy的新的类定义。
重新编译发布整个工程,问题解决。
EJB2和EJB3的不一样,而且好像和容器提供商也有关,这里给出的是适用于EJB3和JBoss4的:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "queue/email"),
@ActivationConfigProperty(
propertyName = "maxSession",
propertyValue = "1")})
关键的就是那个maxSession,它控制实例的最大个数。
前两天碰到一个奇怪的问题,异常的信息就是NoClassDefFoundError,但是需要加载的类肯定是可以找得到的,最后问题的根源在于内存不足,由于产品需要加载的类非常的多,到现在我们的maxPermSize已经需要设置为128m了,而那个错误就是由于内存不足,类初始化的时候内存不足无法初始化成功导致出现NoClassDefFoundError,这个就让我联想到原来经常遇到的类实例初始化的异常,最终报的错也是NoClassDefFoundError,呵呵,所以,以后遇到这个异常要仔细看看后面的详细异常信息,如果是<clinit>抛出的,基本上就是初始化失败而不是真正的找不到类定义了。
© 2025 解惑
本主题由Anders Noren提供 — 向上 ↑