尝试从 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的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Glassfish 4.1 Web 管理员创建任何 JMS 资源

从远程客户端使用 Glassfish JMS

将远程 JMS 客户端连接到 GlassFish 3

使用glassfish服务器的JMS客户端

Glassfish JMS(平面文件)身份验证

javax.jms.JMSException:配置超过 50 个资源适配器时出现最大连接数 (50) 错误 - MDB