【问题标题】:Unable to find JNDI resource for JMS Chat Application找不到 JMS 聊天应用程序的 JNDI 资源
【发布时间】:2012-03-22 07:47:10
【问题描述】:

我正在尝试开发一个在 Glassfish 3 上运行的 JMS 应用程序。 Eclipse Indigo 是我的 IDE。 我尝试运行 this example。如果你觉得有必要,我会在这里复制代码。 我不明白我应该用 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

根据我的阅读,在服务器上,InitialContext 应该会自动工作。

我做错了什么?

【问题讨论】:

  • 引用你上面链接的例子,你用什么替换了行:// ... specify the JNDI properties specific to the vendor?因为这是您初始化用于查找对象的上下文的地方。
  • @AhmadSaleh 我没有用任何东西替换它。我读过InitialContext jndi = new InitialContext(); 应该这样做,所以不使用Properties env。我在Properties 上没有找到任何关于JNDIGlassfish 的教程。

标签: java jms jndi glassfish-3


【解决方案1】:

在构造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  

【讨论】:

  • 它不工作。我得到同样的例外。您还有其他想法吗?
  • @Dragos 我认为您的问题在于缺少一些 glassfish 罐子,您需要将一些罐子添加到客户的类路径中。这些罐子应该包含在 glassfish 安装中(在“lib”目录中)。我不确定需要什么罐子,您可能希望最初添加所有罐子 - 以确保这是问题所在 - 然后清理。这篇文章可能对blog.thejeearchitectcookbook.net/post/2011/01/30/… 有所帮助
  • 是的,我想通了。感谢您的帮助。
【解决方案2】:

原来是我的类路径的 JAR 问题。所需的 JAR 是问题中指定的一个,另外两个在接受的答案 here 中,即:gf-client-module.jarimqjmsra.jarimqbroker.jar

【讨论】:

    【解决方案3】:

    我希望这段代码对你有帮助,我的环境: JEE6+glassfish3V

     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) {
                    }
               }
          }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2015-03-05
      • 2013-01-17
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多