消息中间件的一些名词:
Producer 生产者:
Consumer 消费者:
Broker: MQ服务器
Topic 主题:分类业务逻发送短信主题、发送优惠卷主题
Queue:存放消息的队列 先进先出 后进后出 原则 底层数组或者链表
Message: 生产者投递的报文:json
消费者netty客户端与nettyServer端MQ服务器端保持长连接,MQ服务器端保存
消费者连接。
生产者netty客户端发送请求给nettyServer端MQ服务器端,MQ服务器端在将该
消息内容发送给消费者。
body:{"msg":{"userId":"123456","age":"23"},"type":"producer",”topic”:””}
传输的报文就是一个json的字符串
生产者投递消息给MQ服务器端,MQ服务器端需要缓存该消息
MQ的实现
基于多线程队列简单实现mq
import com.alibaba.fastjson.JSONObject;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 无网络的情况下利用多线程实现MQ
* 利用多线程制造消费者和生产者
*/
public class MultithreadMQ {
//MQ服务器 存储消息的队列
private static LinkedBlockingQueue<JSONObject> message=new LinkedBlockingQueue<>();
//主函数
public static void main(String[] args) {
//生产者 生产线程
Thread producerThread =new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
Thread.sleep(3000);
JSONObject data=new JSONObject();
data.put("userId","123");
System.out.println("生产消息");
//存入消费队列
message.offer(data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"生产者");
//调用生产线程
producerThread.start();
//消费者 消费线程
Thread consumeThread =new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
JSONObject data =message.poll();
if (data!=null){
System.out.println(Thread.currentThread().getName()+",获取到数据:"+data);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
},"消费者");
//调用消费线程
consumeThread.start();
}
}
基于网络通讯版本的mq netty实现
首先导入相关依赖
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.23.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artif