From 1d6fc57d27451ebb3ded7c299c2cd536d2970b3a Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Mon, 21 Apr 2025 10:15:16 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/impl/StompServiceImpl.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/m2pool-modules/m2pool-chat/src/main/java/com/m2pool/chat/service/impl/StompServiceImpl.java b/m2pool-modules/m2pool-chat/src/main/java/com/m2pool/chat/service/impl/StompServiceImpl.java index 6aa6061..d926e5a 100644 --- a/m2pool-modules/m2pool-chat/src/main/java/com/m2pool/chat/service/impl/StompServiceImpl.java +++ b/m2pool-modules/m2pool-chat/src/main/java/com/m2pool/chat/service/impl/StompServiceImpl.java @@ -14,6 +14,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.messaging.simp.user.SimpUserRegistry; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -36,6 +39,9 @@ public class StompServiceImpl implements StompService { @Resource private ChatRoomMapper chatRoomMapper; + @Resource + private TransactionTemplate transactionTemplate; + @Override public AjaxResult sendMessageToUser(UserMessageVo userMessageVo) { WebsocketMessageDto websocketMessageDto = new WebsocketMessageDto(); @@ -47,11 +53,24 @@ public class StompServiceImpl implements StompService { } //当前用户发送其他人, 发送给指定用户. 否则默认发送给当前发送者 messagingTemplate.convertAndSendToUser(userMessageVo.getEmail(), Destination.QUEUE + "/" + userMessageVo.getEmail(), userMessageVo.getContent()); - // 接收者和发送者 都不是游客才能存储消息 和修改聊天室信息 - if (!TOURIST.equals(userMessageVo.getReceiveUserType()) && TOURIST.equals(userMessageVo.getSendUserType())){ - Long id = insertMessage(userMessageVo); - websocketMessageDto.setId(id); - updateRoom(userMessageVo); + // 接收者和发送者 都不是游客才能存储消息 和修改聊天室信息。后续可改为消息中间件解耦形式。 + if (!TOURIST.equals(userMessageVo.getReceiveUserType()) && !TOURIST.equals(userMessageVo.getSendUserType())){ + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + @Override + protected void doInTransactionWithoutResult(TransactionStatus status) { + try { + // 插入消息并获取 ID + Long id = insertMessage(userMessageVo); + websocketMessageDto.setId(id); + // 更新房间信息 + updateRoom(userMessageVo); + } catch (Exception e) { + // 回滚事务 + status.setRollbackOnly(); + throw e; + } + } + }); } return AjaxResult.success(websocketMessageDto); }