尝试从Glassfish获取JMS资源时的javax.naming.NoInitialContextException

时间:2015-03-09 10:30:12

标签: java java-ee glassfish jms jndi

我是JMS的新手,并尝试使用Glassfish应用服务器执行我的第一个JMS程序。

我在Glassfish管理控制台中创建了连接工厂[jms / MyQueueFactory]和目标资源[jms / myQueue],如下所示:

Connection factory: jms/MyQueueFactory

Queue: 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:需要在中指定类名   环境或系统属性,或作为applet参数,或在   应用程序资源文件:java.naming.factory.initial at   javax.naming.spi.NamingManager.getInitialContext(未知来源)at   javax.naming.InitialContext.getDefaultInitCtx(未知来源)at   javax.naming.InitialContext.getURLOrDefaultInitCtx(未知来源)at at   javax.naming.InitialContext.lookup(未知来源)at   com.test.MyReceiver.main(MyReceiver.java:16)

请告诉我这里缺少的东西。

感谢。

1 个答案:

答案 0 :(得分:0)

由于您是从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);

使用此对象可以初始化上下文。