您的位置:首页 > 编程语言 > Java开发

ActiveMQ实现简单的聊天室功能

2017-03-28 23:58 1381 查看

博主这是经历了整整一个下午的研究,参考书《Java 消息服务》,实现一个简单的聊天功能,使用开源JMS提供者ActiveMQ5.14.4 + JDK1.8简单的聊天室例子。

转载请注明出处http://blog.csdn.net/qq_28695619

本人遇见的坑如下,希望对大家有所帮助。

1.ActiveMQ的配置和安装,我的是Win8.1的系统,各位首先需要来这里下载符合自己系统的版本ActiveMQ下载地址,下载完成后,将其解压并且找到对应jar包的路径



环境变量的配置:

往CLASSPATH里面添加如下需要使用的jar包

F:\apache-activemq-5.14.4\activemq-all-5.14.4.jar;F:\apache-activemq-5.14.4\bin\wrapper.jar;


2.遇见的ERROR分析

<1>错误: 找不到或无法加载主类 org.tanukisoftware.wrapper.WrapperSimpleApp

解决办法:不要添加ACTIVEMQ_HOME 这个环境变量;


<2>错误:javax.naming.NameNotFoundException TopicCF

解决办法:jndi.properties文件要放在如下路径




别名为topic1 的jms的主题必须在如下图的broker节点下



3.在cmd如何运行

首先你需要运行activemq.bat



在项目路径下运行cmd窗口输入如下命令,同时在两个cmd中输入java命令,将会看到文章最后的效果



这是实现的代码类

package com.yqq.test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.file.attribute.UserPrincipalNotFoundException;
import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Chat implements javax.jms.MessageListener{

private TopicSession pubSession;
private TopicPublisher publisher;
private TopicConnection connection;
private String username;

public Chat(String topicFactory,String topicName,String userName) throws Exception {
Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, "system");
env.put(Context.SECURITY_CREDENTIALS, "manager");
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
env.put(Context.PROVIDER_URL, "tcp://localhost:61616");

//使用jndi.properties文件获得一个JNDI连接
InitialContext ctx = new InitialContext(env);
//查找JMS连接工厂并创建连接
TopicConnectionFactory conFactory = (TopicConnectionFactory) ctx.lookup(topicFactory);
TopicConnection connection = conFactory.createTopicConnection();

//创建两个JMS会话
TopicSession pubSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
TopicSession subSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

//查找一个JMS主题
Topic chatTopic = (Topic) ctx.lookup(topicName);

//创建一个JMS发布者和订阅者。
//createSubscriber中附加的参数是一个消息选择器(null)和noLocal标记的一个真值,
//它表明这个发布者生产的消息不应被它自己所消费
TopicPublisher publisher = pubSession.createPublisher(chatTopic);
TopicSubscriber subscriber = subSession.createSubscriber(chatTopic, null,true);

//设置一个JMS消息侦听器
subscriber.setMessageListener(this);

//初始化Chat应用程序变量
this.connection = connection;
this.pubSession = pubSession
4000
;
this.publisher = publisher;
this.username = userName;

//启动JMS连接;允许传送消息
connection.start();
}

/**
* 接收来自TopicSubscriber的消息
*/
@Override
public void onMessage(Message arg0) {
TextMessage textMessage = (TextMessage) arg0;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}

}
/*
* 使用发布者创建并发送消息
*/
protected void writeMessage(String text) throws JMSException{
TextMessage message = pubSession.createTextMessage();
message.setText(username + ": " + text);
publisher.publish(message);

}
/*
* 关闭JMS连接
*/
public void close()throws JMSException {
connection.close();
}

public static void main(String[] args) {
try {

if(args.length!=3)
System.out.println("Factory,Topic,or username Missing!");
Chat chat = new Chat(args[0], args[1], args[2]);

//从命令行读取
BufferedReader commandLine = new BufferedReader(new InputStreamReader(System.in));

//循环,直到键入 "exit" 为止
while(true){
String s = commandLine.readLine();
if (s.equalsIgnoreCase("exit")) {
chat.close();
System.exit(0);
} else chat.writeMessage(s);
}

} catch (Exception e) {
e.printStackTrace();
}
}

}


这个是实验成功后的图片

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jms
相关文章推荐