《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包、说明文件以及效果图都在里面。
把同样的事情做出自己的特色,这就是我想要的!!!
中亭(花名)
分享到:
相关推荐
基于Java的聊天室,开发坏境为MyEclipse,Sql server2005,主要功能包括注册,登录,显示我的好友和在线好友,增加好友,删除好友,私聊,显示聊天记录等功能。
java实现聊天室 具有服务端和客户端功能 chat.rar
Java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...
只要运行chatserver.java 然后双击chat.html就可以运行了,
基于JAVA的聊天室 主函数 chatServer.java chatClient.java 很好,很强大!
聊天室的源码,java实现,主要是socket方面的编程。主要是实现思路
很不错的用java servlet技术实现的web chat功能,很适合想学习J2EE开发的初学者查看。
java 聊天室程序代码 欢迎您的批评指正,
Java聊天室程序源 ,大家可以看看,我也在看。
Java课程设计全套源码:聊天室源码+数据库
Java聊天室程序源 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法...
java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...
用Java编写的Chat聊天小程序。用于初学者学习Java基础很有帮助。
java课程作业之一(sysu),启动时先启动服务器Server,再根据需要依次启动客户端Client,具体次数可由自己决定。只能实现简单的信息互传,同时可以区分不同客户端和服务器的不同消息
基于Java实现的端到端加密的聊天室系统完整源码+项目说明 【模块】 Netty实现的聊天客户端和服务器 NIO实现的聊天客户端和服务器 日志解密工具 【打包文件】 netty-chat-server.jar: Netty实现的服务器 netty-chat-...
Java聊天室程序源码(毕业设计) , 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端 当...
用java语言 Socket Thread 实现的 聊天室 例子。分为Server、Client端,先运行Server,再运行Client
利用java编写的聊天室,有些bug 请多多指点
用java编写的网络聊天室程序 程序很简单 功能很全 适合学习用