EJB3.0在发布时出现异常javax.naming.NameNotFoundException: myqueue not bound

本文介绍了一个使用JBoss应用服务器实现消息队列的例子,包括如何通过客户端发送消息到队列,以及如何在服务器端配置并接收这些消息。同时解决了在启动过程中遇到的队列未找到的问题。

Service:

 
package com.test.ejb;
 
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.ejb.ActivationConfigProperty;
@MessageDriven(
 activationConfig ={
   @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Queue"),
   @ActivationConfigProperty(propertyName="destination",propertyValue="queue/myqueue")
 }
)
 
public class MyQueueMDBBean implements MessageListener {
 
 public void onMessage(Message msg) {
  TextMessage textMessage =(TextMessage)msg;
  
  try {
   System.out.println("MyQueueMDBBean被调用了【"+textMessage.getText()+"】");
   
  } catch (JMSException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
 }
 
}
 
Client:
 
 
package com.test.ejb;
 
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
public class MyQueueMDBBeanClient {
 
 /**
  * @param args
  */
 public static void main(String[] args) {
 
  try {
   //获取QueueConnectionFactory对象
   InitialContext context =new InitialContext();
   QueueConnectionFactory factory =(QueueConnectionFactory)context.lookup("ConnectionFactory");
   
   //创建QueueConnection
   QueueConnection connnection =factory.createQueueConnection();
   
   //创建QueueSession
   QueueSession session =connnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
   
   //获取Destination对象
   Queue queue =(Queue)context.lookup("queue/myqueue");
   
   //获取文本信息
   TextMessage msg =session.createTextMessage("世界你好啊!");
   
   //创建发送者
   QueueSender sender =session.createSender(queue);
   
 //关闭会话
   session.close();
   connnection.close();

   //发送消息
   sender.send(msg);
   
   System.out.println("消息已发送");
  } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (JMSException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 
 }
 
}
 
发布启动Jboss时出现异常:
javax.naming.NameNotFoundException: myqueue 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:713)
 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:673)
 at javax.naming.InitialContext.lookup(InitialContext.java:392)
 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$SetupActivation.run(JmsActivation.java:729)
 at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204)
 at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
 at java.lang.Thread.run(Thread.java:619) 
 
 
  解决办法:
 
 我发现在JBoss根目录\server\default\deploy 下的mail-service.xml文件中加入如下:

<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.org.destination:server=Queue,name=myqueue" >
  <attribute name="JNDIName" >queue/myqueue</attribute>
  <depends optional-attribute-name = "DestinationManager" > jboss.mq:service=DestinationManager </depends>
</mbean>

重启JBoss问题即解决。

 

topic找不到

  <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.org.destination:server=Topic,name=mytopic" > 
     <!-- JNDI名称 -->
     <attribute name="JNDIName">topic/mytopic</attribute> 
     <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> 
   </mbean> 
在WebLogic服务器中,当尝试查找`UserInfoRemote#com.lkm.ejb.remote.UserInfoRemote`,若出现`javax.naming.NameNotFoundException`,并且提示“subcontext not found”,通常表示在JNDI命名空间中未能正确解析`com.lkm.ejb.remote`这一子上下文路径。此类问题常见于EJB的JNDI绑定配置不正确、部署描述符未正确设置或应用服务器未正确发布EJB的绑定信息等情况[^1]。 ### JNDI绑定路径与EJB配置 EJB的JNDI绑定名称通常由应用服务器根据部署配置自动生成,也可以通过`@Stateless`注解或`ejb-jar.xml`文件显式指定。例如: ```java @Stateless(name = "com.lkm.ejb.remote.UserInfoRemote") public class UserInfoBean implements UserInfoRemote { // Bean实现 } ``` 在WebLogic中,EJB的JNDI名称通常会包含应用名、模块名和EJB名称,例如: ``` myapp#mymodule!com.lkm.ejb.remote.UserInfoRemote ``` 如果使用了子上下文`com.lkm.ejb.remote`,则需要确保该路径在JNDI树中确实存在。若在部署未正确创建该子上下文,或者EJB未绑定到该路径,就会导致查找失败并抛出`NameNotFoundException`[^1]。 ### 部署描述符配置验证 在`ejb-jar.xml`中,可以通过`<jndi-name>`元素显式指定EJB的绑定路径: ```xml <session> <ejb-name>UserInfoBean</ejb-name> <remote>com.lkm.ejb.remote.UserInfoRemote</remote> <ejb-class>com.lkm.ejb.remote.UserInfoBean</ejb-class> <session-type>Stateless</session-type> <jndi-name>com.lkm.ejb.remote.UserInfoRemote</jndi-name> </session> ``` 此外,WebLogic还支持在`weblogic-ejb-jar.xml`中配置JNDI名称,确保该文件中的绑定路径与实际查找路径一致: ```xml <weblogic-ejb-jar> <enterprise-beans> <session-descriptor> <jndi-name>com.lkm.ejb.remote.UserInfoRemote</jndi-name> </session-descriptor> </enterprise-beans> </weblogic-ejb-jar> ``` ### JNDI路径验证与调试 可以通过编写JNDI浏览代码来检查当前JNDI树的结构,确认子上下文是否存在: ```java public static void listJndiContext(Context context, String path) throws NamingException { NamingEnumeration<NameClassPair> list = context.list(path); while (list.hasMore()) { NameClassPair pair = list.next(); System.out.println(pair.getName() + " [" + pair.getClassName() + "]"); } } ``` 调用该方法以查看`com.lkm.ejb`路径下的子上下文: ```java Context context = new InitialContext(); listJndiContext(context, "com.lkm.ejb"); ``` 如果`remote`子上下文不存在,则说明EJB未正确绑定到该路径,需检查部署日志或调整绑定配置。 ### 示例代码:EJB JNDI查找 以下是一个通过JNDI查找远程EJB的完整示例: ```java import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class EjbClient { public static void main(String[] args) { try { Context context = new InitialContext(); UserInfoRemote userInfo = (UserInfoRemote) context.lookup("com.lkm.ejb.remote.UserInfoRemote"); String result = userInfo.getUserInfo("testUser"); System.out.println(result); } catch (NamingException e) { e.printStackTrace(); } } } ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值