使用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个队列,即对于每一个用户来说,发送消息为一个队列,接受消息为一个队列。
效果如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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实现简易聊天功能相关推荐
- java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...
学习完J2SE可以写一个简易的聊天软件来让刚学的知识融会贯通,代码注释的很详细哦! 开发版本历程: V0.1:客户端实现一个界面 V0.2:客户端界面有输入框和显示框的界面 V0.3:客户端关闭按钮可 ...
- uniapp - 实现类似微信聊天、淘宝买卖双方交流的简易聊天功能示例(开箱即用,完整源码与注释)全端兼容 H5 App 小程序,稳定无 BUG!
介绍 本示例 100% 丝滑流畅可跨多端兼容,而且没有任何第三方插件和依赖. 如果要想实现一个类似像淘宝天猫这些买家和卖家沟通的系统(还有微信聊天这种),实际上非常难, 我打造了一个uniapp H5 ...
- Socket编程一实现简易的聊天功能以及文件传输
干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江 ...
- 纯JAVA模拟、实现QQ简易聊天互动程序
实现的功能.步骤: 1.定义JFrame窗体中的组件 2.在构造方法中初始化窗体的组件 3.使用网络编程完成数据的传输(TCP,UDP协议) 4.实现发送按钮的监听点击事件 5.实现回车键发送数据 功 ...
- 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)
最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...
- 基于 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. ...
- python实现简易聊天需要登录_python编写简易聊天室实现局域网内聊天功能
本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下 功能: 可以向局域网内开启接收信息功能的ip进行发送信息,我们可以写两段端口不同的代码来实现在一台电脑上与自己 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)...
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...
- Express+Socket.IO 实现简易聊天室
代码地址如下: http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...
最新文章
- [JavaME]手机申请移动分配的动态IP(3)?
- pycryptodom的源码安装
- java类加载器_类加载器ClassLoader
- 树莓派python编程小车_python3实现网页版raspberry pi(树莓派)小车控制
- FTP服务器之pure-ftpd常见问题及解决方法
- PHP的var_dump(‘1‘==‘1e0‘)的结果为true
- MySQL百一题库_「灵魂拷问」MySQL面试高频一百问(工程师方向)
- 打造自己的.NET Core项目模板
- 7z替换exe文件内容不能替换文件_Windows小技巧 批处理文件实现目录下文件批量打包压缩...
- BookCorpus数据集爬虫
- 获取.propertys文件获取文件内容
- HDOJ--1495--非常可乐(隐式图)
- CMOS checksum error-Defaults loaded 故障解决办法
- 互联网晚报 | 12月10日 星期五 | B站月均活跃UP主达270万人;宝马电动车总销量破百万;苹果市值逼近3万亿美元...
- Postman如何设置为中文
- js前端缓存的几种方法
- 隐藏桌面图标通过命令行启动
- 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
- EHR_ERAL_KAYANG店铺提点方案相关函数
- Cesium上帝视角漫游
热门文章
- 在idea中使用debug
- 一文带你了解微信/支付宝支付的相关概念
- springMVC简易学习笔记一
- Redis 基本命令、键(key)命令、基本数据类型(命令行操作)
- LayaAir 图集动画2—动画运用
- java dialog 用法_详解Java编程JDialog窗体的用法及实例
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_3_Properties集合中的方法load...
- Python requests库
- 11th Iran Nationwide Internet Contest 解题报告
- HDUOJ---1233还是畅通工程