《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编程...
Java 实现聊天室功能是一个复杂的项目,需要使用多种技术和知识点。服务器端代码使用 Java 语言和 Swing 库来创建一个多人聊天室系统,支持群聊、公聊、私聊等功能,並支持刷新好友列表。该项目可以作为 Java 程序员...
Java聊天室程序是一种基于Java编程语言实现的在线交流平台,它允许用户通过网络进行实时文本聊天。...通过研究这些代码和文档,你可以深入理解Java聊天室程序的实现细节,并从中学习到上述的各种技术。
标题中的"网络聊天室chatserver.java"指的是一个Java程序,用于建立一个网络聊天室服务端。这个服务端程序,通常称为服务器,是整个聊天系统的核心,它负责接收客户端的连接请求,处理通信,并将消息广播给其他在线...
3. **聊天室服务器**:`chatserver`可能是这个项目的服务器端程序,它包含RMI服务器的实现,包括创建远程对象,注册到RMI注册表,并处理来自客户端的请求,如接收消息、广播消息等。 4. **聊天室客户端**:`...
【Java实现的聊天室程序】是一个基于JAVA编程语言开发的多用户交互系统,它允许用户进行实时的文字交流。这个程序的核心在于实现客户端与服务器端的通信,以及在多个客户端之间同步消息传递。以下是对该程序相关知识...
在Java编程领域,实现一个聊天室是一个常见的项目实践,它涉及到网络编程、多线程以及用户界面设计等关键知识点。本项目"java实现聊天室"旨在构建一个具有服务端和客户端功能的简单通信系统,允许用户通过网络进行...
Java聊天室程序是一种基于Java编程语言实现的在线交互平台,允许用户通过网络进行实时通信。在本案例中,"java_chat.rar"是一个压缩文件,包含了Java聊天室的源代码,可以供开发者学习和研究。"java鑱婂ぉ"和"java鑱...
在本文中,我们将深入探讨如何使用Java和Spring MVC框架实现一个基于WebSocket的多人聊天室。WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许实时双向通信,非常适合用于在线聊天应用。 首先,我们...
在本文中,我们将深入探讨如何使用Java语言实现一个聊天室,重点在于Socket编程技术。Java是一种广泛用于网络通信的编程语言,其强大的网络库使得创建聊天室这样的实时交互应用程序变得相对简单。 首先,我们需要...
在这个聊天室项目中,`chatServer.java`文件代表服务器端程序,而`chatClient.java`则是客户端程序。服务器端通过开启一个监听特定端口的Socket来接收客户端的连接请求,而客户端则通过创建Socket连接到服务器,实现...
Java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...
在这个Java实现的WebSocket聊天室项目中,我们将探讨如何构建一个基本的聊天系统,支持私聊功能,并实现心跳包机制。 首先,我们需要了解WebSocket的基本原理。WebSocket协议基于TCP,它通过HTTP/1.1的Upgrade头来...
这个"JAVA综合实验2聊天室"项目旨在让学生理解网络编程的基本原理,特别是如何利用Java实现客户端和服务器之间的通信,以及如何设计多用户交互的系统。下面,我们将详细分析这个项目的各个方面。 首先,Java是一种...
Java Web 网页聊天室是一种基于Java Servlet技术构建的在线交流平台,它允许用户通过浏览器进行实时对话。对于想要学习J2EE(Java 2 Platform, Enterprise Edition)开发的初学者来说,这是一个很好的实践项目,因为...
【标签】中的"icq-im-chat" 和 "icq" 强调了此项目与流行的ICQ即时通讯服务相关,而"java聊天室"和"聊天室"再次明确了这是一个使用Java语言构建的多用户聊天环境。 【压缩包子文件的文件名称列表】: 1. "基于JAVA...
在这个项目中,我们将讨论如何使用Java实现一个带有图形用户界面(GUI)的聊天室,其中双方通过socket进行通信。Socket是网络编程中的基本组件,它允许两个或多个应用程序通过网络交换数据。 首先,我们需要了解...
在本项目"HappyChatChat_聊天室_java_"中,我们将深入探讨其背后的编程技术和实现原理。 一、Java基础知识 Java作为跨平台的面向对象编程语言,是构建此类应用的理想选择。其强大的类库支持网络通信,如Socket编程...
Java WebSocket 是一种在客户端和服务器之间建立长连接的协议,它允许双向通信,即服务器和...实际开发中,你可能还需要考虑更多的功能,比如用户身份验证、消息存储、群组聊天等,这些都是扩展聊天室功能的重要方面。