首页 > 代码库 > 分析Chat示例的源代码

分析Chat示例的源代码

这里我们来详细讲解一下前一节的示例:Chat。先来了解Chat应用程序的TopicConnectionFactory和Topic的相关配置信息。在示例中,已经将它们分别命名为TopicCF和topic1。例如,使用ActiveMQ,可以在类路径中创建一个jndi.properties文件,为Chat应用程序设置TopicConnectionFactory名称和一个Topic:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
java.naming.security.principal = system
java.naming.security.credentials = manager
connectionFactoryNames = TopicCF
topic.topic1 = jms.topic1

jndi.properties文件还包含了JMS提供者的JNDI连接信息。你需要设置连接到JMS服务器所需要的初始化上下文工厂类,提供者URL,用户名及密码等。每家厂商都将拥有一个不同的上下文工厂类和URL名称,用于连接到服务器。要获得这些值,需要查阅特定的JMS提供者或JavaEE容器的相关文档。

在配置并启动JMS服务器之后,你就要编译Chat应用程序。如果我们使用的ActiveMQ,那我们的类路径中就必须加上:activemq-all-xxx.jar文件。

Chat应用程序是一个聊天室程序,聊天客户端为一个特定的主题创建一个JMS发布者和订阅者。该主题就代表了聊天室。JMS服务器注册了所有想要发布或订阅一个特定主题的JMS客户端。在一个聊天客户端的命令行中输入文本时,它会发布消息给传送服务器。消息传送服务器会识别出和该发布者有关的主题。并将消息传送给已经订阅该主题的所有JMS客户端。

获得一个JNDI连接

JNDI是一个与具体实现无关的API,用于目录和命名服务系统。JMS客户端可以使用一个目录服务来访问ConnectionFactory和Destination(主题和队列)对象。ConnectionFactory和Destination对象是绝无仅有的使用JMS API无法获得的对象。JNDI为获得ConnectionFactory和Destination对象提供了一种方便,位置透明,可配置并且可移植的机制,这些对象也称为JMS受管对象,因为它们是由一个系统管理员建立和配置的。使用JNDI,JMS客户端就可以通过首先查找一个ConnectionFactory来实现对一个JMS提供者的访问。ConnectionFactory用于创建JMS连接,而该连接随后就可以用于发送和接收消息。也可以通过JNDI来获得Destination对象,也就是JMS当中的虚拟通道(主题和队列),并由JMS客户端使用。

要创建一个到JNDI命名服务的连接,就需要先创建一个javax.naming.InitialContext对象。一个InitialContext就是所有JNDI查找的起始点,它和文件系统根目录的概念很相似。InitialContext提供了一个到目录服务的网络连接,这个目录服务就发挥访问JMS受管对象的根目录的作用。

TopicConnectionFactory

一旦实例化一个JNDI  InitialContext对象,就可以使用它在消息传送服务器的命名服务中查找 TopicConnectionFactory:

InitialContext ctx = new InitlalContext();
TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx.lookup(topicFactory);

TopicConnectionFactory提供了两个重载版本的createTopicConnection()方法:

public TopicConnection createTopicConnection()
public TopicConnection createTopicConnection(String username,String password)
        throws JMSException,JMSSecurityException


分析Chat示例的源代码