这两天一直被在Weblogic下集成第三方JMS实现而烦恼.
环境:
App Server: Weblogic 8.1SP4
JMS provider: ActiveMQ
之所以选用ActiveMQ,最主要理由因为是它是免费的,而且对Spring的支持很好.
开始先用在Tomcat下运行无问题的默认 Spring 配置进行部署,在Weblogic下运行失败
错误详情:
Error 500--Internal Server Error
java.lang.NoSuchMethodError: javax.jms.ConnectionFactory.createConnection()
使用ActiveMQ2.0新版,文档中说提升了对JCA的支持,在Weblogic等APP容器上可以用RA的方式实现Message Driven POJO.
使用中,把jca的Spring样例考入程序,不能运行,在id="activeMQContainer"的BEAN中加上abstract="true"的属性后运行通过.
经查看ActiveMQ的源码,问题并不是Spring配置文件的问题,而是出在org.codehaus.activemq.jca.JCAContainer类的第77行处,
代码片断如下:
for (int i = 0; i < names.length; i++) {
// TODO one day we could be smart to only pre-load the correct
// types of bean, based on the definitions?
String name = names[i];
beanFactory.getBean(name); //Error
//我在用Spring处理事务的时候,曾经把一个模板类定义成了Abstract,因此如果getBean企图生成一个抽象类的实例,则抛异常.
}
我是通过加了个判断:
if(!name.equalsIgnoreCase("txProxyTemplate")) {
beanFactory.getBean(name);
}
暂时跳过了这个问题,Spring应该有判断一个Bean是否abstract为true的方法.
做了实验依旧不行,开始琢磨Weblogic的console,发现了Foreign JMS Server项,
在网上查了查,有的文档说在weblogic中集成第三方JMS实现要配置此项,于是开始设置,还是不行...
这也不成那也不成,把weblogic.jar中的class全部换成了geronimo-spec-j2ee-1.4-rc3.jar文件中的,一切OK了.
可是老这样用crack之后的weblogic.jar也不舒服,考虑到今后部署的麻烦和修改jar文件可能带来的版权法律问题,还是决定再试试其他方法.
想到weblogic总是说java.jms.Connection中"NoSuchMethodError",而对我JMS的新规范实现视而不见,想到有可能jar在classpath中loading的前后位置有问题,就试着改了改.
把geronimo-spec-j2ee-1.4-rc3.jar文件在classpath中的位置提在weblogic.jar之前. 问题解决...
想来我这几天,先是怀疑weblogic对JMS1.1标准支持不良.
然后又怀疑是ActiveMQ的jca有bug(实际上的确是有一点).
之后又是在weblogic里大肆配置Foreign JMS Server和Bridge Destination.
后来竟然把weblogic.jar做了crack,而且居然AppServer跑起来没有什么问题.
最后把JMS1.1版本的规范实现jar包放在weblogic.jar之前来loading,问题就这么简单的解决了.
无语...