使用ActiveMQ实现简易聊天功能

一 什么是消息队列

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ

二 为什么要用消息队列

使用消息队列主要有两点好处:

1.通过异步处理提高系统性能(削峰、减少响应所需时间);

2.降低系统耦合性。如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。

三 ActiveMQ

ActiveMQ 是基于 JMS 规范实现的。

JMS消息列队有两种消息模式,一种是点对点的消息模式,还有一种是订阅的模式。

四 实现

ActiveMQ下载地址:http://activemq.apache.org/components/classic/download/

解压缩apache-activemq-5.xxx-bin.zip到一个目录

启动ActiveMQ:运行C:\ apache-activemq-5.xxx\bin\activemq.bat

浏览器中输入:http://localhost:8161/admin/ 测试启动情况

使用点对点方式实现聊天功能

编写消息发送类和接收类。发送类中需要连接ActiveMQ 服务器,创建队列,发送消息;接收类中需要ActiveMQ 服务器,读取发送者发送消息所用的队列。接收类实现为一个单独的线程,使用监听器模式,每隔一段时间侦听是否有消息到来,若有消息到来,将消息添加到辅助类消息列表中。

使用2个队列,即对于每一个用户来说,发送消息为一个队列,接受消息为一个队列。

效果如下:

 1 import org.apache.activemq.ActiveMQConnectionFactory;
 2
 3 import javax.jms.*;
 4
 5 import static java.lang.Thread.sleep;
 6
 7 public class MessageReceiver implements Runnable{
 8     private String url;
 9     private String user;
10     private String password;
11     private final String QUEUE;
12     private Boolean stop;
13     Connection connection;
14
15     public MessageReceiver(String queue, String url, String user, String password) {
16         this.url = url;
17         this.user = user;
18         this.password = password;
19         this.QUEUE = queue;
20         stop = false;
21     }
22
23     public void run() {
24         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
25         try {
26             connection = connectionFactory.createConnection();
27             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
28             Destination receiveQueue = session.createQueue(QUEUE);
29             MessageConsumer consumer = session.createConsumer(receiveQueue);
30             connection.start();
31             while(!stop) {
32                 consumer.setMessageListener(new MessageListener() {
33                     @Override
34                     public void onMessage(Message message) {
35                         try {
36                             //获取到接收的数据
37                             String text = ((TextMessage) message).getText();
38                             MessageText.setMsg(text);
39                         } catch (JMSException e) {
40                             e.printStackTrace();
41                         }
42                     }
43                 });
44                 sleep(500);
45             }
46         } catch (JMSException e) {
47             e.printStackTrace();
48         }catch (InterruptedException e) {
49             //Thread.currentThread().interrupt();
50             e.printStackTrace();
51         }
52     }
53
54     public void setStop(Boolean stop) {
55         this.stop = stop;
56     }
57
58     public void closeConnection(){
59         try {
60             connection.close();
61         } catch (JMSException e) {
62             e.printStackTrace();
63         }
64     }
65
66     public String getUrl() {
67         return url;
68     }
69
70     public void setUrl(String url) {
71         this.url = url;
72     }
73
74     public String getUser() {
75         return user;
76     }
77
78     public void setUser(String user) {
79         this.user = user;
80     }
81
82     public String getPassword() {
83         return password;
84     }
85
86     public void setPassword(String password) {
87         this.password = password;
88     }
89 }

MessageReceiver

 1 import org.apache.activemq.ActiveMQConnectionFactory;
 2
 3 import javax.jms.*;
 4 import java.text.DateFormat;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Date;
 7
 8 public class MessageSender {
 9     private String url;
10     private String user;
11     private String password;
12     private final String QUEUE;
13     private Connection connection;
14     private Session session;
15     private Destination sendQueue;
16     private MessageProducer sender;
17     private TextMessage outMessage;
18     private DateFormat df;
19
20     public MessageSender(String queue, String url, String user, String password) {
21         this.url = url;
22         this.user = user;
23         this.password = password;
24         this.QUEUE = queue;
25     }
26
27     public void init() {
28         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
29         df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
30         try {
31             connection = connectionFactory.createConnection();
32             connection.start();
33             session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
34             sendQueue = session.createQueue(QUEUE);
35             sender = session.createProducer(sendQueue);
36             outMessage = session.createTextMessage();
37         } catch (JMSException e) {
38             e.printStackTrace();
39         }
40     }
41
42     public void sendMessage(String messageStr) {
43         try {
44             outMessage = session.createTextMessage();
45             String sendStr = df.format(new Date()) + "\n" + QUEUE + ": " + messageStr;
46             outMessage.setText(sendStr);
47             sender.send(outMessage);
48             session.commit();
49             MessageText.setMsg(sendStr);
50         } catch (JMSException e) {
51             e.printStackTrace();
52         }
53     }
54
55     public void closeConnection() {
56         try {
57             sender.close();
58             connection.close();
59         } catch (JMSException e) {
60             e.printStackTrace();
61         }
62     }
63
64     public String getUrl() {
65         return url;
66     }
67
68     public void setUrl(String url) {
69         this.url = url;
70     }
71
72     public String getUser() {
73         return user;
74     }
75
76     public void setUser(String user) {
77         this.user = user;
78     }
79
80     public String getPassword() {
81         return password;
82     }
83
84     public void setPassword(String password) {
85         this.password = password;
86     }
87 }

MessageSender

原文地址:https://www.cnblogs.com/flyuz/p/10682756.html

时间: 2024-12-25 19:47:17

使用ActiveMQ实现简易聊天功能的相关文章

Socket编程一实现简易的聊天功能以及文件传输

干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖. 如果你有好看的武侠系列小说,给我留言哦.题外话就扯这么多了,接着还是上技术. 看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,[凤歌]我采用的服务器发送消息. 是不是只有发送消息,有些显得太单调了.好,在发送消息的基础上增加文件传输.后期会增加视频,音频的传输,增加表情包.那一起来看

php_3_“简易聊天室 ”实现的关键技术 详解

                  PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可以看到,具体功能如下: a.用户登录:用户发言时显示其登录名信息 b.用户发言:用户输入说的话 c.显示发言信息:用户浏览所有发言信息 设计思路: (1).建立聊天室数据库及相关数据表 (2).实现用户登录页面(login.php) (3).实现发言页面(speak.php) (4).实现发言显示页

使用Firefly编写简易聊天室

1.创建工程命令行下输入firefly-admin.py createproject chat_rooms(linux在终端输入),<ignore_js_op> firefly会在C盘Users目录中的MSI文件夹下创建一个名为chat_rooms的工程<ignore_js_op> 2.导入工程将工程导入到eclipse中<ignore_js_op> 3.配置参数配置config.json中的相应参数<ignore_js_op> 3.配置参数配置config

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)

RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案. "企业通"是RDIFramework.NET框架提供的一个即时通讯.内部聊天沟通的工具.虽不能与商业化专业的沟通工具相比,但对于框架内部进行消息的沟通还是比较方便的.成功登录框架后,点击框架主菜单"辅助工具"→"企业通&

socket.io入门,简易聊天室

介绍 通常我们web使用的是http协议,但是 HTTP 协议有一个缺陷:通信只能由客户端发起. 所以我们需要一个可以由服务端主动发出的协议,即WebSocket. WebSocket是HTML5新增的一种通信协议,其特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种. Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯.通知与消息推送,实时分析等场景中有较为广泛的应用. socket.io 包含两个

基于C/S模式的简易聊天室

一.任务简要描述 移动互联网技术的广泛应用为人们提供了非常便捷的沟通方式.QQ.微信和微博等是便携式聊天系统的典型代表,它们的功能非常强大. 本系统利用TCP/IP协议的Socket和ServerSocket类,实现基于C/S模式的简易聊天室.该聊天室包括服务端和客户端两部分,服务端是客户端发送消息的中转站:客户端之间可以直接通信,也可以与服务器通信.聊天结束后客户端断开与服务端的连接,服务器也可以停止信息中转服务. 二.系统需求分析 本系统采用C/S软件架构,服务器端负责监听客户端发来的消息,

[Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少了不像QQ一样的端对端的聊天了.本篇博文将介绍如何使用SignalR来实现类似QQ聊天的功能. 二.使用SignalR实现端对端聊天的思路 在介绍具体实现之前,我先来介绍了使用SignalR实现端对端聊天的思路.相信大家在前篇文章已经看到过Clients.All.sendMessage(name,

php+websocket搭建简易聊天室实践

1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短连接和长连接.短连接一般可以用ajax实现,长连接就是websocket.短连接实现起来比较简单,但是太过于消耗资源.websocket高效不过兼容存在点问题.websocket是html5的资源 如果想要详细了解websocket长连接的原理请看https://www.zhihu.com/ques