【问题标题】:JNDI without a J2EE Container (with JNP? Maybe some other provider?)没有 J2EE 容器的 JNDI(使用 JNP?也许是其他一些提供者?)
【发布时间】:2010-09-16 14:27:50
【问题描述】:

我需要在没有 J2EE 容器开销的情况下运行 JNDI 提供程序。我试图按照article 中的说明进行操作,它准确地描述了(第 3 页)我想要做什么。不幸的是,这些方向都失败了。我也必须将 jboss-common.jar 添加到我的类路径中。一旦我这样做了,我会得到一个堆栈跟踪:

$ java org.jnp.server.Main
0    [main] DEBUG
org.jboss.naming.Naming  - Creating
NamingServer stub, theServer=null,rmiPort=0,clientSocketFactory=null,serverSocketFactory=org.jboss.net.sockets.DefaultSocketFactory@ad093076[bindAddress=null]
Exception in thread "main"
java.lang.NullPointerException
     at org.jnp.server.Main.getNamingInstance(Main.java:301)
     at org.jnp.server.Main.initJnpInvoker(Main.java:354)
     at org.jnp.server.Main.start(Main.java:316)
     at org.jnp.server.Main.main(Main.java:104)

我希望完成这项工作,但我也愿意向其他轻量级独立 JNDI 提供者开放。所有这一切都是为了使 ActiveMQ 工作,如果有人可以建议另一个轻量级 JMS 提供程序,它在 vm 之外运行良好,客户端所在的客户端没有一个完整的应用程序服务器也可以工作。

【问题讨论】:

    标签: java jakarta-ee jboss jms jndi


    【解决方案1】:

    JBoss JMQ 也可以仅使用 MicroKernel 和非常少的库集来运行。 JBoss AS 安装程序具有“配置文件”选项,其中之一是用于独立 JMQ。它还允许您挑选和选择组件(尽管它对您的依赖关系没有太多帮助)。您是否尝试过运行安装程序?

    【讨论】:

    • 这是一个很好的建议,但如果可能的话,我真的需要远离 JBoss。如果我不能摆脱它,我一定会像你建议的那样尽可能减少它。
    【解决方案2】:

    像这样使用 jndi.properties 文件:

    java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
    
    # use the following property to configure the default connector
    java.naming.provider.url=tcp://jmshost:61616
    
    # use the following property to specify the JNDI name the connection factory
    # should appear as. 
    #connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
    
    # register some queues in JNDI using the form
    # queue.[jndiName] = [physicalName]
    #queue.MyQueue = example.MyQueue
    
    
    # register some topics in JNDI using the form
    # topic.[jndiName] = [physicalName]
    topic.myTopic = MY.TOPIC
    

    确保此文件位于您的类路径中。然后你可以像这样查找主题/队列(减去适当的尝试/捕获):

    context = new InitialContext(properties);
    
    context = (Context) context.lookup("java:comp/env/jms");
    
    topicConnectionFactory = (TopicConnectionFactory) context.lookup("ConnectionFactory");
    
    topic = (Topic) context.lookup("myTopic");
    

    【讨论】:

    • 请注意,您使用的 JNDI 提供程序不是 Simple JNDI - 而是 ActiveMQ 附带的 JNDI 提供程序 :)。查看 java.naming.factory.initial 条目的类名 :)
    • 哇,你说得对。我认为 simple-jndi 正在发挥作用。我们已经在项目中使用它来进行 JDBC 数据源查找。我已经更正了我的输入。
    【解决方案3】:

    Apache ActiveMQ 已经带有一个集成的轻量级 JNDI 提供程序。见these instructions on using it

    基本上,您只需将 jndi.properties 文件添加到类路径即可。

    java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
    
    # use the following property to configure the default connector
    java.naming.provider.url = failover:tcp://localhost:61616
    
    # use the following property to specify the JNDI name the connection factory
    # should appear as. 
    #connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry
    
    # register some queues in JNDI using the form
    # queue.[jndiName] = [physicalName]
    queue.MyQueue = example.MyQueue
    
    
    # register some topics in JNDI using the form
    # topic.[jndiName] = [physicalName]
    topic.MyTopic = example.MyTopic
    

    【讨论】:

    • 这似乎没有涵盖我们需要 TCP JNDI 提供者的事实。除非我完全弄错了,否则 VM 端点不能跨 VM 工作。我需要能够运行通过 JNDI 交谈的单独进程。这个 JNDI 提供者可以做到吗?
    • 抱歉 - 剪切和粘贴问题。我刚刚更新了 java.naming.provider.url 条目,因此它使用 TCP - 并使用故障转移,如果套接字失败或代理被退回,默认情况下您应该使用它重新连接
    • 太好了,谢谢。我得试试这个,看看它是否适合我。
    猜你喜欢
    • 2017-08-13
    • 2012-02-14
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多