Java 找不到JMS聊天应用程序的JNDI资源

Java 找不到JMS聊天应用程序的JNDI资源,java,jms,jndi,glassfish-3,Java,Jms,Jndi,Glassfish 3,我正在尝试开发一个运行在GlassFish3上的JMS应用程序。 Eclipse Indigo是我的IDE。 我试过跑步。如果你觉得有必要,我会把代码复制到这里。 我不太明白我应该如何处理JNDI。我已经通过管理控制台创建了两个所需的资源,它们具有确切的指定名称,但我得到了以下例外情况: java.lang.RuntimeException: Orb initialization erorr at org.glassfish.enterprise.iiop.api.GlassFishORBHel

我正在尝试开发一个运行在GlassFish3上的JMS应用程序。 Eclipse Indigo是我的IDE。 我试过跑步。如果你觉得有必要,我会把代码复制到这里。 我不太明白我应该如何处理JNDI。我已经通过管理控制台创建了两个所需的资源,它们具有确切的指定名称,但我得到了以下例外情况:

java.lang.RuntimeException: Orb initialization erorr
at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at Chat.<init>(Chat.java:38)
at Chat.main(Chat.java:113)
Caused by: java.lang.NullPointerException
at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
... 9 more
javax.naming.NamingException: Lookup failed for 'TopicConnectionFactory' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at Chat.<init>(Chat.java:38)
at Chat.main(Chat.java:113)
Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is java.lang.RuntimeException: Orb initialization erorr]
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)
... 4 more
Caused by: java.lang.RuntimeException: Orb initialization erorr
at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
at com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
at com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
at com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
... 5 more
Caused by: java.lang.NullPointerException
at org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
... 9 more
java.lang.RuntimeException:Orb初始化erorr
位于org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
位于com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
位于com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
位于com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
位于com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)上
在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)上
在javax.naming.InitialContext.lookup(InitialContext.java:411)
聊天室。(Chat.java:38)
在Chat.main(Chat.java:113)
原因:java.lang.NullPointerException
位于org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
... 9更多
javax.naming.NamingException:在SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.url.pkgs=com.sun.enterprise.naming,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl}中查找“TopicConnectionFactory”失败[根异常为javax.naming.NamingException:无法获取SerialContext的SerialContextProvider[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDistrateFactoryImpl}][根异常为java.lang.RuntimeException:Orb初始化erorr]]
在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)上
在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)上
在javax.naming.InitialContext.lookup(InitialContext.java:411)
聊天室。(Chat.java:38)
在Chat.main(Chat.java:113)
原因:javax.naming.NamingException:无法获取SerialContext的SerialContextProvider[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl}[根异常为java.lang.RuntimeException:Orb初始化erorr]
位于com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:352)
在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)上
…还有4个
原因:java.lang.RuntimeException:Orb初始化erorr
位于org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:180)
位于com.sun.enterprise.naming.impl.SerialContext.getORB(SerialContext.java:365)
位于com.sun.enterprise.naming.impl.SerialContext.getProviderCacheKey(SerialContext.java:372)
位于com.sun.enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:402)
位于com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)
…还有5个
原因:java.lang.NullPointerException
位于org.glassfish.enterprise.iiop.api.GlassFishORBHelper.getORB(GlassFishORBHelper.java:152)
…还有9个
据我所知,在服务器上,InitialContext应该自动工作


我做错了什么?

在构造
InitialContext
时,您需要提供一些属性来描述如何从JNDI服务器访问和获取对象

主要需要提供一个标记供应商实现的属性和另一个指向数据存储位置的属性,并且可能需要指定其他安全性或特定于供应商的属性

在您的案例(glassfish)中,我认为需要设置以下属性:

// the initial context factory, choosing the glassfish implementation
env.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
// glassfish's server location
env.setProperty("org.omg.CORBA.ORBInitialHost", "<host name or IP>");
env.setProperty("org.omg.CORBA.ORBInitialPort", "<port number>"); // default is 3700  
//初始上下文工厂,选择glassfish实现
setProperty(“java.naming.factory.initial”、“com.sun.enterprise.naming.SerialInitContextFactory”);
//glassfish的服务器位置
setProperty(“org.omg.CORBA.ORBInitialHost”,”;
env.setProperty(“org.omg.CORBA.ORBInitialPort”,“”);//默认值为3700

我的类路径出现了一个JAR问题。需要的JAR是问题中指定的JAR,另外两个是公认答案中指定的JAR,即:
gf client module.JAR
imqjmsra.JAR
imqbroker.JAR
,我希望这段代码能对您有所帮助,我的环境: JEE6+玻璃鱼3V

 private static ConnectionFactory connectionFactory;
 private static Queue queue;
 public static void main(String[] args) throws NamingException {
      Connection connection = null;
      Session session = null;
      MessageConsumer consumer = null;
      TextMessage message = null;

      Properties env = new Properties();

      //glassfish3V
      env.put(Context.PROVIDER_URL, "iiop://localhost:8080");
      InitialContext jndi = new InitialContext(env);
      connectionFactory = (ConnectionFactory) jndi.lookup("jms/ConnectionFactory");
      queue = (Queue) jndi.lookup("jms/Queue"); // put your Queue here


      try {
           connection = connectionFactory.createConnection();
           session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
           consumer = session.createConsumer(queue);
           connection.start();

           while (true) {
                Message m = consumer.receive(1);

                if (m != null) {
                     if (m instanceof TextMessage) {
                          message = (TextMessage) m;
                          System.out.println(
                                  "Reading message: " + message.getText());
                     } else {
                          break;
                     }
                }
           }
      } catch (JMSException e) {
           System.err.println("Exception occurred: " + e.toString());
      } finally {
           if (connection != null) {
                try {
                     connection.close();
                } catch (JMSException e) {
                }
           }
      }
 }

参考您上面链接的示例,您用什么替换了这一行:
/…指定特定于供应商的JNDI属性
?因为这是您初始化用于查找对象的上下文的地方。@AhmadSaleh我没有用任何东西替换它。我读过
InitialContext JNDI=new InitialContext()
应该可以,所以没有使用
Properties env
。我还没有找到任何关于
JNDI
Glassfish
Properties
的教程。它不起作用。我得到了同样的例外。你有什么其他想法吗?@Dragos我想你的问题是缺少一些Glassfish罐子,你需要在你客户的电脑上添加一些罐子这些JAR应该包含在glassfish安装中(在“lib”目录中)。我不确定需要哪些JAR,您可能需要先添加所有JAR,以确保这是问题所在,然后再进行清理。这篇文章可能会有所帮助。是的,我已经解决了。谢谢您的帮助。