WildFly 18 JMS客户端报NameNotFoundException求助
解决WildFly JMS客户端的javax.naming.NameNotFoundException异常
嘿,我看到你作为JMS和WildFly的新手,在运行自定义客户端时遇到了javax.naming.NameNotFoundException,这种问题在刚接触远程JMS访问时确实很常见,我来帮你一步步排查解决!
问题根源分析
从你的异常信息和代码、配置来看,核心问题出在远程客户端无法访问WildFly的本地JNDI资源:
- 你客户端代码里的队列JNDI名是
java:/jms/queue/test,这个前缀属于WildFly的本地JNDI上下文,只有服务器内部的应用才能访问,远程客户端无权直接获取。 - 你的standalone-full.xml中,Test队列只配置了本地条目,没有导出到远程可访问的JNDI上下文(
java:jboss/exported/前缀)。
具体解决步骤
1. 更新WildFly的JMS队列配置(standalone-full.xml)
找到你配置里的Test队列节点,添加一个远程导出的JNDI条目,这样远程客户端就能lookup到它:
<jms-queue name="Test" entries="java:/jms/queue/test java:jboss/exported/jms/queue/test"/>
这里新增的java:jboss/exported/jms/queue/test就是供远程客户端使用的JNDI路径。
2. 修正客户端代码中的JNDI名称
把客户端里的DEFAULT_DESTINATION修改为远程可访问的名称:
// 简化写法(远程InitialContext会自动在java:jboss/exported下查找) private static final String DEFAULT_DESTINATION = "jms/queue/test"; // 或者写全路径也可以 // private static final String DEFAULT_DESTINATION = "java:jboss/exported/jms/queue/test";
另外,你的连接工厂名称DEFAULT_CONNECTION_FACTORY可以简化为jms/RemoteConnectionFactory,和队列名称保持一致的风格,不过你当前的jboss/exported/jms/RemoteConnectionFactory写法也能正常工作。
3. 确保用户拥有JMS操作权限
从你的配置里看到,security-setting给guest角色开放了发送、消费等权限,所以需要把你的adminuser加入到guest角色中:
- 打开WildFly管理控制台(默认地址:
http://localhost:9990) - 进入Configuration > Users and Roles > Roles
- 编辑
guest角色,将adminuser添加到成员列表,保存配置。
4. 重启WildFly
修改完配置后,务必重启WildFly服务器,让新的JNDI导出配置生效。
完成以上步骤后,重新运行你的JMS客户端,应该就能成功连接到WildFly、lookup到队列和连接工厂,正常发送和接收消息了!
内容的提问来源于stack exchange,提问作者Naresh V
相关产品推荐
相关产品推荐

