日期:2014-05-20  浏览次数:20748 次

请教JMS+JNDI问题
最近在学习JMS,用的ActiveMQ,在创建连接和主题的时候发现可以用JNDI来搞,网上有段代码如下:
Java code

public Chat(String topicFactory,String  topicName,String username) throws Exception 
    {             
        //使用jndi.properties文件获得一个JNDI连接            
        InitialContext ctx = new InitialContext();            
        //查找一个JMS连接工厂并创建连接            
        TopicConnectionFactory conFactory =(TopicConnectionFactory)ctx.lookup(topicFactory); 
        TopicConnection connection = conFactory.createTopicConnection();             
        //创建两个JMS会话对象            
        TopicSession pubSession =  connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
        TopicSession subSession =  connection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
        //查找一个JMS主题            
        Topic chatTopic =(Topic)ctx.lookup(topicName); 
                        。
                        。
                        。
          }      




  这里对方法lookup比较困惑,不知道那个参数该传什么,所以去网上查了下资料,发现JNDI是这么说的:它为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。命名服务提供了一种为对象命名的机制,这样你就可以在无需知道对象位置的情况下获取和使用对象。只要该对象在命名服务器上注册过,且你必须知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。就可以找到该对象,获得其引用,从而运用它提供的服务。命名服务提供名称—对象的映射。目录服务提供有关对象的信息,并提供定位这些对象所需的搜索工具。

  好,现在就以上情况,我想问几个问题:
  1、lookup的参数该传什么进去,为什么?
  2、这里说JNDI为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。那么JMS算什么?命名还是目录?还是其他?
  3、命名服务器是什么?怎样在命名服务器上注册对象?

  最好有JMS+JDNI使用的例子,谢谢~

  PS:我使用的IDE是MyEclipse。。

------解决方案--------------------
1、lookup的参数该传什么进去,为什么?

lookup 的参数是 JNDI 的名字,在 Java EE 6 之前,各种服务器提供的 EJB/JMS 等的 JNDI 命名规则不统一。这个名字需要由服务端提供。JNDI 的名字就相当于文件系统中某个文件的路径名。

2、这里说JNDI为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。那么JMS算什么?命名还是目录?还是其他?
JMS 是 J2EE 中的标准服务之一—— Java 消息服务,与 JNDI 无关。

3、命名服务器是什么?怎样在命名服务器上注册对象?
命名服务器,第一次听说,我想可以认为是管理 JNDI 资源的容器。一般通过 J2EE 应用服务器的管理平台将对象绑定到 JNDI 上面去。

JNDI API 中包含两块,一块是命名服务,另一块是目录服务。对应于 J2SE 的 javax.naming 包及其子包中的 API。JNDI 中有很多东西,有兴趣的话可以去看看 JNDI Tutorial: http://java.sun.com/products/jndi/tutorial/
------解决方案--------------------
因为 JMS 规范规定其中的几个对象必须从 JNDI 上获得。
------解决方案--------------------
探讨
不一定要用JNDI啊,JNDI指可以获得ConnectionFactory和destination对象,但也可以用以下方法获得ConnectionFactory和destination:

------解决方案--------------------
LZ,你创建了JNDI服务了么?!创建了后可以在里面注册JMS的服务,同时会提供一个名称,这个名称就是lookup的参数
------解决方案--------------------
JNDI,你到你的服务器上找总能找到对应的jndi name,比如weblogic、jboss

然后你就知道你要lookup什么了
------解决方案--------------------
探讨
自己顶起来~

------解决方案--------------------
lookup后面的参数就是应用服务器(如WEBLOGIC)JMS中配置的队列的(JNDI名称)