diff --git a/im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java b/im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java index 353dcaf..ba51bc5 100644 --- a/im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java +++ b/im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java @@ -53,6 +53,8 @@ public class RedisMQPullTask implements CommandLineRunner { List datas = new LinkedList<>(); try { if(redisMQTemplate.isClose()){ + // 如果redis未初始化或已断开,3s后再重新尝试消费 + EXECUTOR.schedule(this, 3, TimeUnit.SECONDS); return; } if (consumer.isReady()) { @@ -79,7 +81,7 @@ public class RedisMQPullTask implements CommandLineRunner { if (!EXECUTOR.isShutdown()) { if (datas.size() < batchSize) { // 数据已经消费完,等待下一个周期继续拉取 - EXECUTOR.schedule(this, period, TimeUnit.MICROSECONDS); + EXECUTOR.schedule(this, period, TimeUnit.MILLISECONDS); } else { // 数据没有消费完,直接开启下一个消费周期 EXECUTOR.execute(this); @@ -102,6 +104,9 @@ public class RedisMQPullTask implements CommandLineRunner { objects.add(obj); obj = redisMQTemplate.opsForList().leftPop(key); } + if (!Objects.isNull(obj)){ + objects.add(obj); + } } return objects; } diff --git a/im-uniapp/pages/chat/chat-box.vue b/im-uniapp/pages/chat/chat-box.vue index fac5e36..013cd11 100644 --- a/im-uniapp/pages/chat/chat-box.vue +++ b/im-uniapp/pages/chat/chat-box.vue @@ -132,9 +132,10 @@ showRecord: false, keyboardHeight: 322, atUserIds: [], - recordText: "", needScrollToBottom: false, // 需要滚动到底部 - showMinIdx: 0 // 下标小于showMinIdx的消息不显示,否则可能很卡 + showMinIdx: 0, // 下标小于showMinIdx的消息不显示,否则可能很卡 + reqQueue: [], // 请求队列 + isSending: false // 是否正在发送请求 } }, methods: { @@ -154,11 +155,7 @@ } // 填充对方id this.fillTargetId(msgInfo, this.chat.targetId); - this.$http({ - url: this.messageAction, - method: 'POST', - data: msgInfo - }).then((m) => { + this.sendMessageRequest(msgInfo).then((m) => { m.selfSend = true; this.$store.commit("insertMessage", m); // 会话置顶 @@ -278,19 +275,14 @@ receipt: this.isReceipt, type: 0 } + this.sendText = ""; // 填充对方id this.fillTargetId(msgInfo, this.chat.targetId); - this.sendText = ""; - this.$http({ - url: this.messageAction, - method: 'POST', - data: msgInfo - }).then((m) => { + this.sendMessageRequest(msgInfo).then((m) => { m.selfSend = true; this.$store.commit("insertMessage", m); // 会话置顶 this.moveChatToTop(); - this.sendText = ""; }).finally(() => { // 滚动到底部 this.scrollToBottom(); @@ -408,11 +400,7 @@ let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.content = JSON.stringify(res.data); msgInfo.receipt = this.isReceipt - this.$http({ - url: this.messageAction, - method: 'POST', - data: msgInfo - }).then((m) => { + this.sendMessageRequest(msgInfo).then((m) => { msgInfo.loadStatus = 'ok'; msgInfo.id = m.id; this.isReceipt = false; @@ -463,11 +451,7 @@ let msgInfo = JSON.parse(JSON.stringify(file.msgInfo)); msgInfo.content = JSON.stringify(data); msgInfo.receipt = this.isReceipt - this.$http({ - url: this.messageAction, - method: 'POST', - data: msgInfo - }).then((m) => { + this.sendMessageRequest(msgInfo).then((m) => { msgInfo.loadStatus = 'ok'; msgInfo.id = m.id; this.isReceipt = false; @@ -632,6 +616,32 @@ let px = info.windowWidth * rpx / 750; return Math.floor(rpx); }, + sendMessageRequest(msgInfo){ + return new Promise((resolve,reject)=>{ + // 请求入队列,防止请求"后发先至",导致消息错序 + this.reqQueue.push({msgInfo,resolve,reject}); + this.processReqQueue(); + }) + }, + processReqQueue(){ + if (this.reqQueue.length && !this.isSending) { + this.isSending = true; + const reqData = this.reqQueue.shift(); + this.$http({ + url: this.messageAction, + method: 'post', + data: reqData.msgInfo + }).then((res)=>{ + reqData.resolve(res) + }).catch((e)=>{ + reqData.reject(e) + }).finally(()=>{ + this.isSending = false; + // 发送下一条请求 + this.processReqQueue(); + }) + } + }, generateId(){ // 生成临时id return String(new Date().getTime()) + String(Math.floor(Math.random() * 1000)); diff --git a/im-web/src/components/chat/ChatAtBox.vue b/im-web/src/components/chat/ChatAtBox.vue index 25ab54a..556b1cf 100644 --- a/im-web/src/components/chat/ChatAtBox.vue +++ b/im-web/src/components/chat/ChatAtBox.vue @@ -1,5 +1,5 @@