《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包、说明文件以及效果图都在里面。
把同样的事情做出自己的特色,这就是我想要的!!!
中亭(花名)
上一篇: 2010年10月份总结
下一篇: 2010年8月份总结