在上一篇文章中我们对MDB用一个实例进行了了解,在实例的过程中出现了这样的一个异常.服务器和客户端的异常分别如下.
Jboss端的错误提示:
19:38:19,749 INFO [JmsActivation] Attempting to reconnect org.jboss.resource.adapter.jms.inflow.JmsActivationSpec@ed8545(ra=org.jboss.resource.adapter.jms.JmsResourceAdapter@1b7c40 destination=topic/mytopic destinationType=javax.jms.Topic tx=true durable=false reconnect=10 provider=java:/DefaultJMSProvider user=null maxMessages=1 minSession=1 maxSession=15 keepAlive=60000 useDLQ=true DLQHandler=org.jboss.resource.adapter.jms.inflow.dlq.GenericDLQHandler DLQJndiName=queue/DLQ DLQUser=null DLQMaxResent=5) 19:38:19,752 ERROR [JmsActivation] Unable to reconnect org.jboss.resource.adapter.jms.inflow.JmsActivationSpec@ed8545(ra=org.jboss.resource.adapter.jms.JmsResourceAdapter@1b7c40 destination=topic/mytopic destinationType=javax.jms.Topic tx=true durable=false reconnect=10 provider=java:/DefaultJMSProvider user=null maxMessages=1 minSession=1 maxSession=15 keepAlive=60000 useDLQ=true DLQHandler=org.jboss.resource.adapter.jms.inflow.dlq.GenericDLQHandler DLQJndiName=queue/DLQ DLQUser=null DLQMaxResent=5) javax.naming.NameNotFoundException: mytopic not bound at org.jnp.server.NamingServer.getBinding(NamingServer.java:771) at org.jnp.server.NamingServer.getBinding(NamingServer.java:779) at org.jnp.server.NamingServer.getObject(NamingServer.java:785) at org.jnp.server.NamingServer.lookup(NamingServer.java:443) at org.jnp.server.NamingServer.lookup(NamingServer.java:399) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:726) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686) at javax.naming.InitialContext.lookup(InitialContext.java:411) at org.jboss.util.naming.Util.lookup(Util.java:222) at org.jboss.resource.adapter.jms.inflow.JmsActivation.setupDestination(JmsActivation.java:464) at org.jboss.resource.adapter.jms.inflow.JmsActivation.setup(JmsActivation.java:352) at org.jboss.resource.adapter.jms.inflow.JmsActivation.handleFailure(JmsActivation.java:292) at org.jboss.resource.adapter.jms.inflow.JmsActivation$SetupActivation.run(JmsActivation.java:733) at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:205) at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)
客户端的错误提示.
Exception in thread "main" javax.naming.NameNotFoundException: mytopic not bound at org.jnp.server.NamingServer.getBinding(NamingServer.java:771) at org.jnp.server.NamingServer.getBinding(NamingServer.java:779) at org.jnp.server.NamingServer.getObject(NamingServer.java:785) at org.jnp.server.NamingServer.lookup(NamingServer.java:443) at org.jnp.server.NamingServer.lookup(NamingServer.java:399) at sun.reflect.GeneratedMethodAccessor270.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) at sun.rmi.transport.Transport$1.run(Transport.java:177) at sun.rmi.transport.Transport$1.run(Transport.java:174) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:173) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160) at org.jnp.server.NamingServer_Stub.lookup(Unknown Source) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:726) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:686) at javax.naming.InitialContext.lookup(InitialContext.java:411) at com.tgb.ejb.MyTopicBeanClient.main(MyTopicBeanClient.java:33)
在分析异常的时候我们不要一下子把自己扎入到一行行的堆栈提示中, 应该能够一眼看到核心的提示和异常内容,根据此异常信息分析问题出现的可能情况.例如在本例中
javax.naming.NameNotFoundException:mytopic not bound
是这些异常信息中最关键的信息.通过定位关键错误信息我们可以更快的找到问题的解决方案.
分析原因mytopic not bound,也就是我们先前的MDB没有被绑定,可能是MDB有问题,也有可能是Jboss的配置文件的问题,而这里出现的原因是因为Jboss的升级不支持原来的写法,所以我们需要在Jboss的配置文件中加上相关的绑定信息
具体做法如下:
在目录D:\Environment\jboss-5.1.0.GA\server\default\deploy\messaging下找到:destinations-service.xml
添加如下配置:
<mbean code="org.jboss.jms.server.destination.QueueService" name="jboss.messaging.destination:service=Queue,name=myqueue" xmbean-dd="xmdesc/Queue-xmbean.xml"> <annotation>@org.jboss.system.deployers.managed.ManagementObjectClass(code=org.jboss.jms.server.destination.QueueServiceMO)</annotation> <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> <depends>jboss.messaging:service=PostOffice</depends> </mbean>
问题即可解决,但是是一个临时的解决方案,每个消息队列都需要添加一下配置文件,更好的解决方式正在寻找中.
问题上升
通过对上面的异常分析一起以前的项目经验我们会经常遇到这类的问题,例如:
javax.naming.NameNotFoundException: *** not bound
这时候我们需要做的是检查一下Namespace,Datasource,EJB,MDB 等等相关内容是否被绑定.如果想查看某个资源是否被绑定我们可以访问Jboss的jmx-console.
http://localhost:8080/jmx-console/
然后选service=JNDIView,点击list下面的invoke 看一看现在 jboss 的 jndi 里面都有哪些对象直接看最下面的 global部分就可以了,看看有没有定义的资源如果有,那就说明部署成功了.调用应该就没有问题了.
如下图:
如果没有的话,需要手动配置,本文的问题解决方案是通过手动配置解决的,其他的情况例如使用数据库oracle等数据库需要配置相关的配置文件例如 oracle-ds.xml
通过对此问题进行分析,并找到以前类似的问题进行归类总结能够很好的帮助我们提高解决问题的效率,以后再遇到类似的问题就能够迎刃而解.而所谓的项目经验就是在这一个个问题的分析,解决,汇总的过程中所积累的.