public Mono<Collection<GroupMember>> queryGroupMembers(
            @NotNull Long groupId,
            boolean preferCache) {
        try {
            Validator.notNull(groupId, "groupId");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        if (isMemberCacheEnabled) {
            if (preferCache) {
                Map<GroupMember.Key, GroupMember> keyToMember =
                        groupIdToMembersCache.getIfPresent(groupId);
                if (keyToMember != null) {
                    return Mono.just(keyToMember.values());
                }
            }
        }
        Recyclable<List<GroupMember>> recyclableList = ListRecycler.obtain();
        return groupMemberRepository.findGroupMembers(groupId)
                .collect(Collectors.toCollection(recyclableList::getValue))
                .map(groupMembers -> {
                    if (isMemberCacheEnabled) {
                        cacheMembers(groupMembers.getFirst()
                                .getKey()
                                .getGroupId(), groupMembers);
                    }
                    return (Collection<GroupMember>) new ArrayList<>(groupMembers);
                })
                .doFinally(signalType -> recyclableList.recycle());
    }
@return Possible codes: {@link ResponseStatusCode#OK}
        {@link ResponseStatusCode#SEND_MESSAGE_TO_MUTED_GROUP}
        {@link ResponseStatusCode#SEND_MESSAGE_TO_INACTIVE_GROUP}
        {@link ResponseStatusCode#MUTED_GROUP_MEMBER_SEND_MESSAGE}
turms-service/src/main/java/im/turms/service/domain/group/service/GroupMemberService.java