删除的项目影响分页

问题描述 投票:0回答:1

我需要迭代大量用户(10000k+),并在每个用户处理一些逻辑,例如检查用户是否符合我的删除条件,如果是,则发送电子邮件并删除数据库中的用户。

这是我的代码想法,但我面临一些问题。如果我删除用户,则分页会受到影响。我尝试总是从 0 开始分页,但如果某些用户无法处理,那么我的代码就会陷入无限循环。你能帮我如何有效地解决这个问题吗?

@Service
class UserService(private val userRepository: UserRepository, private val emailService: EmailService) {

    fun processInactiveExternalUsersInBatches(pageSize: Int) {
        var page = 0
        var usersPage: Page<User>

        do {
            usersPage = userRepository.findUsersByType(userType = UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
            processUsers(usersPage.content)

            page++
        } while (usersPage.hasNext())
    }

    private fun processUsers(users: List<User>) {
        for (user in users) {
            if (!user.active) {
                // Send an email to the user about deactivation
                emailService.sendDeactivationEmail(user)

                // Delete the user using the repository
                userRepository.delete(user)
            }
        }
    }
}
kotlin spring-data-jpa spring-data spring-repositories
1个回答
0
投票

您可以处理用户并向他们发送电子邮件,但不能删除它们,然后您可以将它们存储在列表中,并在 processInactiveExternalUsersInBatches 结束时删除它们。请注意,我用java修改了你的代码,但我希望你能得到像这样的解决方案:

    @Service
    class UserService(private val userRepository: UserRepository, private val 
    emailService: EmailService) {

    fun processInactiveExternalUsersInBatches(pageSize: Int) {
        var page = 0
        var usersPage: Page<User>

        **var deletedUsers = new ArrayList<User>();**

        do {
            usersPage = userRepository.findUsersByType(userType = 
            UserType.EXTERNAL_USER, PageRequest.of(page, pageSize))
            **var usersToBeDeleted =** processUsers(usersPage.content)
        
            **deletedUsers.addAll(usersToBeDeleted);**

            page++
        } while (usersPage.hasNext())

        **userRepository.deleteAll(deletedUsers);**
    }

    private **List<User>** fun processUsers(users: List<User>) {
        **var deletedUsers = new ArrayList<User>();**
        for (user in users) {
            if (!user.active) {
                // Send an email to the user about deactivation
                emailService.sendDeactivationEmail(user)

                // find deleted users and return them
                **deletedUsers.add(user)**
            }
        }
        **return deletedUsers;**
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.