带你走进EJB--MDB的NameNotFoundException

本文介绍了解决 JBoss 服务器上 MDB (Message-Driven Bean) 绑定异常的方法,通过配置 destinations-service.xml 文件来解决 javax.naming.NameNotFoundException 异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


    在上一篇文章中我们对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 等等相关内容是否被绑定.如果想查看某个资源是否被绑定我们可以访问Jbossjmx-console.

         http://localhost:8080/jmx-console/

          然后选service=JNDIView,点击list下面的invoke 看一看现在 jboss 的 jndi 里面都有哪些对象直接看最下面的 global部分就可以了,看看有没有定义的资源如果有,那就说明部署成功了.调用应该就没有问题了.

         如下图:

计算机生成了可选文字:内夕.国抽普D二扩C豆蕊O乍0.。‘b.中国IT实践达人.语言交互平台.国外在线教育….新发现.〔mytop"GlobalJNDINamespaceobjectNdmeFilterUserTr.sacti。沼essi。nFactory份roxy:$rrox碑58ioplementsinterface。r'jbo,,tmusertxinterface,甘,erTrosacti。招e:,i。nFactory)per,istenceoit:.itN一e二auctionear(class:or'j即interface,N一in薛ontext)+一加cti。沼ervi。eJar禅aucti。nUnit(class:。r'hibernateimplSessi。nFactorylmpl)讥住DKe价eneratorFactory(class:。r'jbossejbplu'inskey'eneratoruuid切JIDKe价enerator下actory〕Sec二e阴ana'eoentyiew(class:or'j即interfacesN一in薛ontext)+一reoote一or'jbossdeplo萝ersspioana'eoentMana'eoentView(class:Proxyfor:。r'Jbossdeployer,spio.a'ementM.agementView)+一reoote(class:rroxyfor:。r'jbossdeployerssp:。ana'eoentM.a'ementView)Sec二eDeplo卿entM.a'er(class:。r'j即interfacesN一:n薛ontext〕+一reoote一or'jbossdeplo萝ersspioana'eoentdeployDeplo卿entMana'er(clas,:Proxyfor:or'jbo,,deployer,spimoa'ementdeployDeplo卿entM.ager)+一reoote(class:Proxyfor:。r'jbossdeplo萝ersspioana'eoentdeployDeplo卿entMana'er)HILoKe声eneratorFactory(class:。r'jbossejbplu'inskey'eneratorhiloHILoKe价eneratorFactory)X蛆o.ectionFactory(class:or'jbossjmsclient油ossConnectionFactor萝)stere汇onnectionFactory(class:or'jbossjoscl.ent油。:sConnectionFactor犷)ofileservice(classctio困ueue(class:or'jbossaop'enerate如roxiesADPProx娜2)or'jbossjmsdestination油ossQueue)toP+-cluProAucOSS.meS叼DS弓J们es弓刁二旦口』。口巴廿伪〔切lboss.mqlboss.pojoihnc'r‘叨”n朽nnSec二eProfileservi。e(cla,,:。rgj仰interface:N一in薛ontext〕+一reoote(class:rroxyfor:。r'jbosspr。filesery:。e:piProfilesery;。e)+一reoote一or'jbossprofileservicespiProfileservice(cla,,:Proxyfor:or'jbo,,profileservice,piProfileservice〕U,erM.a'erBe.(class:。r'j仰interfacesN一:n『ontext)+一reoote一coot沙ejb甘serMana'er(class:Proxyfor:。omt沙ejb甘,erMana'er)+一remote(class:Proxyfor:。omt沙ejb甘serMana'er)叭eue(clas,:or'j即interfacesNoin『ontext)+一my妙eue(class:orgjboss」msdestination皿ossQueue)+一D田(class:。r'jbossjmsdestinati。n皿ossQueue)+一Expir闷ueue(class:or'jbossjosdestination油。,sQueue)』U一』U尸,二~么.…」下舟尸.~-.~‘二.~廿.~1…~.r~,.~~二七.-一二-一~,二.~1气州0.~一尸.~~~孟二~口~孟~~.~~、一一一一一一一一一一一一一一一++l++11十11+++l++十+11+!l+!11占................……

      

        如果没有的话,需要手动配置,本文的问题解决方案是通过手动配置解决的,其他的情况例如使用数据库oracle等数据库需要配置相关的配置文件例如 oracle-ds.xml

        

         通过对此问题进行分析,并找到以前类似的问题进行归类总结能够很好的帮助我们提高解决问题的效率,以后再遇到类似的问题就能够迎刃而解.而所谓的项目经验就是在这一个个问题的分析,解决,汇总的过程中所积累的.

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值