宋黎晓的空间

我们一直在努力....

EJB3+JMS在Jboss上部署常见异常的解决方法

标签: EJB3 JMS JBoss部署 异常 错误

       初次使用EJB3+JMS开发项目,将其放到JBoss部署时,经常遇到一些错误和异常。有时在JBoss部署后启动不了,有时候虽然JBoss部署后能启动,但启动过程中发生一些异常。有时候,使用lookup查找远程EJB组件时报错,或者找不到。
       现在将初次使用EJB3时遇到的一些错误和异常,以及错误出现的原因和解决方法记录下来,以便以后再次遇到时可以方便查找原因。同时也让其他想将EJB3放到Jboss部署,从中遇到同样问题的朋友们能方便找到错误的原因。在以后使用EJB3的开发过程中,再遇到其他的问题,我会一并记录到这里。
下面先列举几个问题:

(一) 调用EJB远程接口的客户端使用 lookup方法出现异常:
1. 异常信息:java.lang.ClassCastException: javax.naming.Reference cannot be cast to ………太长了后面省略。
问题原因:
Jboss目录下有个Client文件夹,下面有一些jar文件是给EJB的远程调用者准备的,这下面的jar文件应该放到我们的调用EJB的程序的classpath中。如果是开发阶段,拷贝到工程里就行了。JBoss4和Jboss5略有不同,Jboss4下有一个叫做jbossall-client的jar文件,这个jar中包含了所有客户端需要的class。JBoss5也有这个文件,可是体积相当小,因为里面没有实际的class,我们需要的class分散在其他的jar中。因此使用JBoss4只需要拷贝jbossall-client即可,使用JBoss5则需要拷贝Client下所有的jar。
2. 异常信息:javax.naming.CommunicationException [Root exception is java.io.InvalidClassException: org.jboss.ejb3.stateless.StatelessRemoteProxy; local class incompatible: stream classdesc serialVersionUID = 2583299153931800023, local class serialVersionUID = -9097306519795868
问题原因:
调用EJB的客户端所使用的JbossClient的类与实际工程部署的JBoss服务器版本不同引起的。我们开发EJB项目时,可能用到的服务器时jboss4,可是开发完成后部署到了Jboss5上,客户端使用的确是Jboss4的jbossall-client.jar,因此就引起了serialVersionUID不一致的错误。
3. 异常信息:javax.naming.NamingException
问题原因:
因为客户端按照ejb的JNDI名称远程查找时,没有找到对应名称的EJB组件。通常我们lookup时用的ejb名称是这样的 ejbname/remote,可是有时候我们用这样的名字来lookup组件时却找不到。其实在Jboss下发布EJB组件根据你发布的方式不同你的EJB组件的名字是不同的。
当你用ear形式发布工程时你的EJB名称需要带有工程名,像这样:工程名/ejbname/remote的形式。
当你用jar形式发布工程时,EJB查找名是不需要带有工程名做前缀的。只要:ejbname/remote 这一部分即可。
(二) JBoss启动报错
1. 异常信息:Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List
问题原因:
实体类注解标注的位置有误,要么写在属性上,要么写在getter上,不能混合使用。
(三) JMS在JBoss部署和调用时,JBoss发生的异常错误
1. JBoss启动时报错,异常信息:for messagingType 'javax.jms.MessageListener ' not found in activation config [ActivationConfigProperty………….,name='jms-ra.rar'
问题原因:
引起该异常的原因是因为消息接收类上缺少注解缺少@ActivationConfigProperty(propertyName   =   "destination",   propertyValue   =   "queue/OECPLoggerListener"),
2. JBoss启动报错,异常信息:
Unable to reconnect org.jboss.resource.adapter.jms.inflow.JmsActivationSpec
.........
WARN  [JmsActivation] Failure in jms activation org.jboss.resource.adapter.jms.inflow.JmsActivationSpec
javax.naming.NameNotFoundException: OECPLoggerListener not bound
 at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)
………
问题原因:
jboss下缺少服务配置文件,在jboss_home/server/default/deploy/目录下,添加一个名称为xxx-service.xml的文件,内容类似下面:
<?xml version="1.0" encoding="UTF-8" ?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.org.destination:server=Queue,name=accpQueue" >
<attribute name="JNDIName" >queue/accpQueue </attribute>
<depends optional-attribute-name = "DestinationManager" >
jboss.mq:service=DestinationManager
</depends>
</mbean>
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.org.destination:server=Topic,name=accpTopic" >
<attribute name="JNDIName" >topic/accpTopic </attribute>
<depends optional-attribute-name = "DestinationManager" >
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
用来描述消息监听的JNDI消息类型等信息。
3. JMS服务配置完成后,部署好的Jboss能正常启动,调试代码,消息发送也正常没有异常,但是却收不到消息
可能原因1:
发送器代码中可能没有调用session.commit()方法。有些EJB的教材上没有写这一行,导致我们照着它来学习的时候也不知道还需要commit。Commit以后消息才能真正的发送出去。
可能原因2:
接收器上增加了过滤消息的注解@ActivationConfigProperty(propertyName   =   "messageSelector",   propertyValue   =   "MessageFormat = 'Version 3.4'") 去掉这个注解就可以接收到消息了。
以上内容是我在将EJB3+JMS在Jboss部署上遇到的异常,同时也将个人的解决方法进行的陈述,希望可以帮助遇到同样问题的朋友,如果大家觉得有疑问,欢迎大家留下宝贵的留言进行相关讨论,谢谢!
 


    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

相关博客:


评论


发表评论

关注此文的人们还关注