`

《Java消息服务》实现Chat聊天室,你需要注意的几件事

阅读更多

《Java消息服务》这本书关于JMS的第一个程序就是一个聊天室,Chat.java。按照书中的代码和后面附录D.3的说明配置,一直有出现各种异常,决定总结一下。

 

1.引用jar缺失。

要想运行Chat应用程序,就需要使用支持JNDI和JMS1.1的JMS提供者。书中使用各ActiveMQ 5.2.0。运行Chat应用前首先需要向项目中加入基础的jar包。如下:activemq-all-5.5.0.jar,log4j-1.2.14.jar,slf4j-log4j12-1.5.11.jar

 

2.JNDI配置文件。

配置文件的内容本文下面有写。关键是jndi.properties文件的位置。Application方式运行程序时,JVM首先会去类路径Classpath查找jndi.properties文件,找到后加载放到Context上下文中。

 

这个类路径一般就是指项目的src的根目录,不过像使用Eclipse这种高级工具时通过"Add to Build Path"也可以把某个jar包或property文件添加到当前运行环境的类路径中去。

大多数情况下"Add to Build Path"这种方式是可以满足要求的,但是对于JNDI读取不可以。即使通过

System.out.println("java.class.path=" + System.getProperty("java.class.path"));

 打印出jndi.properties,即证明jndi.properties文件确实在类路径中。jndi.properties的内容还是没有被读取,Context仍然没有被初始化。正常的初始化代码也会报错,例如:

//初始化Context的代码
InitialContext ctx = new InitialContext();
ctx.list("")

报如下错误:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

所以通过Application调用JNDI的朋友,如果想要你的程序可以正常运行,jndi.properties请务必放在src的根目录下。

 

3.配置ActiveMQ的activemq.xml文件。

如书中所说,到conf目录下面找到activemq.xml文件,在其中添加如下代码:

<destinations>
	<topic name="topic1" physicalName="jms.topic1"/>
</destinations>

可是添加的代码在哪里没有说,为什么添加上面的代码没有说。老实人会说,这是不厚道滴。

首先,位置问题。destinations应该添加在broker节点的里面。大概位置如下:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data">
<destinations>
	<topic name="topic1" physicalName="jms.topic1"/>
</destinations>

其次,为什么要加入上面的几句话。这句话是用来在JMS Server上面上面添加一个主题。每一个JMS Client的都会查找一个JMS主题,多个JMS Clinet会在一个主题内进行会话。 jms.topic1是主题的实际名称,而topic1是主题的别名。别名是为了是代码的复用而引入的,代码对于不同的JMS实现者是高度可移植的。换一个JMS提供商,只需要重新配置一个主题别名,不需要修改代码。

还有就是这个xml中配置的部分和jndi.properties中配置的主题名称要相同,否则会包错误。例如改为一个是topic1,一个是topic2。就会报如下错误:

javax.naming.NameNotFoundException: topic2
	at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:235)
	at javax.naming.InitialContext.lookup(Unknown Source)

 

4.关于ActiveMQ版本。

书中运行的版本是5.2.0。书中没有做过多的要求,于是我就下载了一个5.5.0版本的MQ。发现按照方法3的配置根本就不行,运行activemq.bat时,系统直接报错。报出SAXReader解析XMl的错误异常。可能是配置方式有变化了吧,有空可以整理一下。

 

5.关于运行。

书中没有给出运行多个Chat客户端实例的好方法,只是说可以在Dos窗口下面调用Chat.class。可是由于编译这个程序需要很多其他的lib包,直接在Dos中编译很是费劲。看到有个网友使用Ant来编译和运行,方法不错,不过倒也不用这么费事。使用Eclipse可以直接把工程导出到可执行的jar包,Dos调用这个jar包就可以了。

例如:

导出的文件命名为Chat.jar。暂时放到E盘。

进入Dos命令窗口,到E盘下面,输入如下参数:
E:\>java -jar Chat.jar topicConnectionFactory topic1 Herry

 

多运行几个终端,就可以模拟多个用户聊天了。

 

实际运行效果图如下: 

 

JavaEye图片显示不是很好。可以访问网址:

http://dl.iteye.com/upload/picture/pic/99845/729831df-0630-31a8-aca0-59a0a2ff1793.bmp

 

 

上面就是我在运行《Java消息服务》书中Demo遇到的几个问题,虽然问题看起来都不大,可是差一个问题不解决,Demo就跑不起来。

JNDI的问题卡了我很久,觉得有必要看一下JDK源码JNDI加载部分的实现。

万事开头难,第一关已经过去,相信下面的JMS消息服务学习部分应该会顺利的。

附件中是可以运行的工程、相关的jar包、说明文件以及效果图都在里面。

 

 

把同样的事情做出自己的特色,这就是我想要的!!!

 

中亭(花名)

分享到:
评论
2 楼 至尊宝_唯一 2013-05-22  
关于找不到Propeties文件的方法,你设置一下环境变量,注意当前classpath的设置,这个问题应该可以解决
1 楼 ssy341 2012-05-02  
博主 能加你QQ 交流下不 最近在搞这个东东 我把配置文件加入到 activemq.xml里面去了 启动就报错 不知道为什么?

相关推荐

Global site tag (gtag.js) - Google Analytics