尝试从 Glassfish 获取 JMS 资源时出现 javax.naming.NoInitialContextException
Posted
技术标签:
【中文标题】尝试从 Glassfish 获取 JMS 资源时出现 javax.naming.NoInitialContextException【英文标题】:javax.naming.NoInitialContextException when try to get JMS resource from Glassfish 【发布时间】:2015-05-10 11:28:36 【问题描述】:我是 JMS 的新手,正在尝试使用 Glassfish 应用服务器执行我的第一个 JMS 程序。
我在 Glassfish 管理控制台中创建了连接工厂 [jms/MyQueueFactory] 和目标资源 [jms/myQueue],如下所示:
以下是我的代码:
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.InitialContext;
public class MyReceiver
public static void main(String[] args)
try
InitialContext ctx = new InitialContext();
QueueConnectionFactory f = (QueueConnectionFactory)ctx.lookup("jms/MyQueueFactory"); **// Getting error here**
QueueConnection con = f.createQueueConnection();
con.start();
QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue t = (Queue)ctx.lookup("jms/myQueue");
QueueReceiver receiver = session.createReceiver(t);
MyListener listner = new MyListener();
receiver.setMessageListener(listner);
System.out.println("Receiver1 is ready, waiting for messages...");
System.out.println("press Ctrl+c to shutdown...");
while(true)
Thread.sleep(1000);
catch(Exception e)
e.printStackTrace();
但是当我尝试执行时,它给了我以下错误:
javax.naming.NoInitialContextException: 需要指定类名 环境或系统属性,或作为小程序参数,或在 应用程序资源文件:java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(未知来源)在 javax.naming.InitialContext.getDefaultInitCtx(未知来源)在 javax.naming.InitialContext.getURLOrDefaultInitCtx(未知来源)在 javax.naming.InitialContext.lookup(未知来源)在 com.test.MyReceiver.main(MyReceiver.java:16)
请让我知道我在这里缺少什么。
谢谢。
【问题讨论】:
你的问题得到解答了吗? 我可以说它对我有帮助,我尝试将 jndi-properties.jar 文件放在我的类路径中,错误已解决,但随后我开始收到 Glassfish Jars 的 classnotfound 异常。我试图在我的 Eclipse 中配置 Glassfish,但我无法配置它。但是,我会尝试让你知道我是否会在这方面取得成功。但感谢您的帮助。 :) 你用appclient
运行它了吗?
不,我在windows环境下工作,我尝试直接从eclipse运行。
【参考方案1】:
由于您是从 IDE 运行应用程序,因此您需要一种连接到 Glassfish 服务器的方法。
为此,您必须在环境变量中设置一些属性,或者您也可以创建属性对象
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
props.put(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
props.put(Context.PROVIDER_URL, "http://localhost:4848/");
InitialContext initialContext;
try
initialContext = new InitialContext(props);
使用这个对象你可以初始化上下文。
【讨论】:
以上是关于尝试从 Glassfish 获取 JMS 资源时出现 javax.naming.NoInitialContextException的主要内容,如果未能解决你的问题,请参考以下文章