一 什么是消息队列

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

使用ActiveMQ实现简易聊天功能相关推荐

  1. java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...

    学习完J2SE可以写一个简易的聊天软件来让刚学的知识融会贯通,代码注释的很详细哦! 开发版本历程: V0.1:客户端实现一个界面 V0.2:客户端界面有输入框和显示框的界面 V0.3:客户端关闭按钮可 ...

  2. uniapp - 实现类似微信聊天、淘宝买卖双方交流的简易聊天功能示例(开箱即用,完整源码与注释)全端兼容 H5 App 小程序,稳定无 BUG!

    介绍 本示例 100% 丝滑流畅可跨多端兼容,而且没有任何第三方插件和依赖. 如果要想实现一个类似像淘宝天猫这些买家和卖家沟通的系统(还有微信聊天这种),实际上非常难, 我打造了一个uniapp H5 ...

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

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江 ...

  4. 纯JAVA模拟、实现QQ简易聊天互动程序

    实现的功能.步骤: 1.定义JFrame窗体中的组件 2.在构造方法中初始化窗体的组件 3.使用网络编程完成数据的传输(TCP,UDP协议) 4.实现发送按钮的监听点击事件 5.实现回车键发送数据 功 ...

  5. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...

  6. 基于 WebSocket、Spring Boot 教你实现“QQ聊天功能”的底层简易demo

    目录 前言 一.分析 1.1.qq聊天功能分析 1.2.WebSocket介绍 1.2.1.什么是消息推送呢? 1.2.2.原理解析 1.2.3.报文格式 二.简易demo 2.1.后端实现 2.1. ...

  7. python实现简易聊天需要登录_python编写简易聊天室实现局域网内聊天功能

    本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下 功能: 可以向局域网内开启接收信息功能的ip进行发送信息,我们可以写两段端口不同的代码来实现在一台电脑上与自己 ...

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

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

  9. Express+Socket.IO 实现简易聊天室

    代码地址如下: http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: ...

  10. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...

最新文章

  1. [JavaME]手机申请移动分配的动态IP(3)?
  2. pycryptodom的源码安装
  3. java类加载器_类加载器ClassLoader
  4. 树莓派python编程小车_python3实现网页版raspberry pi(树莓派)小车控制
  5. FTP服务器之pure-ftpd常见问题及解决方法
  6. PHP的var_dump(‘1‘==‘1e0‘)的结果为true
  7. MySQL百一题库_「灵魂拷问」MySQL面试高频一百问(工程师方向)
  8. 打造自己的.NET Core项目模板
  9. 7z替换exe文件内容不能替换文件_Windows小技巧 批处理文件实现目录下文件批量打包压缩...
  10. BookCorpus数据集爬虫
  11. 获取.propertys文件获取文件内容
  12. HDOJ--1495--非常可乐(隐式图)
  13. CMOS checksum error-Defaults loaded 故障解决办法
  14. 互联网晚报 | 12月10日 星期五 | B站月均活跃UP主达270万人;宝马电动车总销量破百万;苹果市值逼近3万亿美元...
  15. Postman如何设置为中文
  16. js前端缓存的几种方法
  17. 隐藏桌面图标通过命令行启动
  18. 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
  19. EHR_ERAL_KAYANG店铺提点方案相关函数
  20. Cesium上帝视角漫游

热门文章

  1. 在idea中使用debug
  2. 一文带你了解微信/支付宝支付的相关概念
  3. springMVC简易学习笔记一
  4. Redis 基本命令、键(key)命令、基本数据类型(命令行操作)
  5. LayaAir 图集动画2—动画运用
  6. java dialog 用法_详解Java编程JDialog窗体的用法及实例
  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_3_Properties集合中的方法load...
  8. Python requests库
  9. 11th Iran Nationwide Internet Contest 解题报告
  10. HDUOJ---1233还是畅通工程