diff --git a/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java b/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java index 0bb3380..02679a2 100644 --- a/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java +++ b/im-center-server/src/main/java/cn/axzo/im/group/GroupManager.java @@ -32,6 +32,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; import javax.validation.constraints.NotNull; import java.util.Collections; @@ -57,8 +58,8 @@ public class GroupManager { private final GroupMemberSyncer groupMemberSyncer; private final GroupRateLimiter rateLimiter; private final Notification notification; + private final TransactionTemplate transactionTemplate; - @Transactional public GroupCreateResponse createGroup(GroupCreateRequest request) { BizAssertions.assertTrue(request.getPeople().size() > 1, "群成员数量(含群主)不能少于2"); groupSupport.log(0L, "create-group:preparing", request); @@ -67,32 +68,34 @@ public class GroupManager { BizAssertions.assertTrue(savedGroup == null || savedGroup.isDismissed(), String.format("群已经存在: %s", request.getName())); ImAccounts imAccounts = accountService.getOrCreateImAccounts(request.getPeople()); - String owner = imAccounts.findAccount(request.getOwner()).orElse(null); - BizAssertions.assertNotNull(owner, "群主没有IM账号, 无法创建群. {}", request.getOwner()); - Group group = groupSupport.buildNewGroup(request, imAccounts); - BizAssertions.assertTrue(group.addMoreMembers( - request.getPeople().size()), "无法创建群, 群成员数量超过上限" + group.getMemberLimit()); - groupDao.save(group); - NimGroupCreateRequest nimRequest = groupSupport - .buildNimCreateGroupRequest(request, imAccounts); - rateLimiter.requireCreateGroup(); - NimGroupCreateResponse nimResponse = nimClient.createGroup(nimRequest); - log.info("创建群, request={}, response={}", nimRequest, nimResponse); - BizAssertions.assertTrue(nimResponse.isSuccess(), "创建群失败: {}", nimResponse.getDesc()); - groupDao.updateTid(group.getId(), nimResponse.getTid()); - group = groupDao.getById(group.getId()); - groupSupport.log(group.getTid(), "create-group", request); - groupMemberSyncer.syncMembers(group); - // 同步完成员后再发消息, 因为接收方可能会查询群成员 - groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_CREATED); - groupBroadcaster.fireMembersChanged(group, - groupMemberDao.getByTid(nimResponse.getTid()), - MqEventType.GROUP_ADD_MEMBERS); - GroupCreateResponse response = new GroupCreateResponse(); - response.setTid(nimResponse.getTid()); - response.setAccountsNotFound(getAccountNotFoundPersons( - "创建群", imAccounts, group, request.getMembers())); - return response; + return transactionTemplate.execute(unused -> { + String owner = imAccounts.findAccount(request.getOwner()).orElse(null); + BizAssertions.assertNotNull(owner, "群主没有IM账号, 无法创建群. {}", request.getOwner()); + Group group = groupSupport.buildNewGroup(request, imAccounts); + BizAssertions.assertTrue(group.addMoreMembers( + request.getPeople().size()), "无法创建群, 群成员数量超过上限" + group.getMemberLimit()); + groupDao.save(group); + NimGroupCreateRequest nimRequest = groupSupport + .buildNimCreateGroupRequest(request, imAccounts); + rateLimiter.requireCreateGroup(); + NimGroupCreateResponse nimResponse = nimClient.createGroup(nimRequest); + log.info("创建群, request={}, response={}", nimRequest, nimResponse); + BizAssertions.assertTrue(nimResponse.isSuccess(), "创建群失败: {}", nimResponse.getDesc()); + groupDao.updateTid(group.getId(), nimResponse.getTid()); + group = groupDao.getById(group.getId()); + groupSupport.log(group.getTid(), "create-group", request); + groupMemberSyncer.syncMembers(group); + // 同步完成员后再发消息, 因为接收方可能会查询群成员 + groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_CREATED); + groupBroadcaster.fireMembersChanged(group, + groupMemberDao.getByTid(nimResponse.getTid()), + MqEventType.GROUP_ADD_MEMBERS); + GroupCreateResponse response = new GroupCreateResponse(); + response.setTid(nimResponse.getTid()); + response.setAccountsNotFound(getAccountNotFoundPersons( + "创建群", imAccounts, group, request.getMembers())); + return response; + }); } @Transactional @@ -112,7 +115,6 @@ public class GroupManager { groupBroadcaster.fireGroupChanged(group, MqEventType.GROUP_DISMISSED); } - @Transactional public GroupAddMembersResponse addMembers(GroupAddMembersRequest request) { Group group = getGroupForUpdateOrThrow(request.getTid()); BizAssertions.assertFalse(group.isDismissed(), "群已经解散"); @@ -129,27 +131,29 @@ public class GroupManager { BizAssertions.assertTrue(group.addMoreMembers(prePersons.size() + addPersons.size()), "群聊人数上限{}人, 请删除部分已选人员", group.getMemberLimit()); ImAccounts imAccounts = accountService.getOrCreateImAccounts(addPersons); - if (imAccounts.isAccountEmpty()) { - notification.send("添加群成员[{},{}], 有效群成员IM账号列表为空. 请求成员信息: {}", - group.getTid(), group.getName(), JSON.toJSONString(request.getMembers())); - return new GroupAddMembersResponse(); - } - NimGroupAddMembersRequest nimRequest = groupSupport - .buildAddMembersRequest(group, group.getOwnerAccount(), imAccounts); - // add members - rateLimiter.requireAddMember(); - NimGroupAddMembersResponse nimResponse = nimClient.addGroupMembers(nimRequest); - log.info("添加群成员, request={}, response={}", nimRequest, nimResponse); - BizAssertions.assertTrue(nimResponse.isSuccess(), "添加群成员失败: {}", nimResponse.getDesc()); - // sync members 2 - groupMemberSyncer.syncMembers(group); - groupBroadcaster.fireMembersChanged(group, - groupMemberDao.getByPersons(group.getTid(), addPersons), - MqEventType.GROUP_ADD_MEMBERS); - GroupAddMembersResponse response = new GroupAddMembersResponse(); - response.setAccountsNotFound(getAccountNotFoundPersons( - "添加群成员", imAccounts, group, addPersons)); - return response; + return transactionTemplate.execute(unused -> { + if (imAccounts.isAccountEmpty()) { + notification.send("添加群成员[{},{}], 有效群成员IM账号列表为空. 请求成员信息: {}", + group.getTid(), group.getName(), JSON.toJSONString(request.getMembers())); + return new GroupAddMembersResponse(); + } + NimGroupAddMembersRequest nimRequest = groupSupport + .buildAddMembersRequest(group, group.getOwnerAccount(), imAccounts); + // add members + rateLimiter.requireAddMember(); + NimGroupAddMembersResponse nimResponse = nimClient.addGroupMembers(nimRequest); + log.info("添加群成员, request={}, response={}", nimRequest, nimResponse); + BizAssertions.assertTrue(nimResponse.isSuccess(), "添加群成员失败: {}", nimResponse.getDesc()); + // sync members 2 + groupMemberSyncer.syncMembers(group); + groupBroadcaster.fireMembersChanged(group, + groupMemberDao.getByPersons(group.getTid(), addPersons), + MqEventType.GROUP_ADD_MEMBERS); + GroupAddMembersResponse response = new GroupAddMembersResponse(); + response.setAccountsNotFound(getAccountNotFoundPersons( + "添加群成员", imAccounts, group, addPersons)); + return response; + }); } @Transactional