Spring @async具有多个动作

时间:2019-03-21 07:37:26

标签: java spring

这是我的代码:

AsyncComponent.Java

@Configuration
public class AsyncComponent {
@Autowired
    private AsyncService asyncService;

    @Async(value="campaignEmails")
    public void sendEmailsToContacts(Campaign campaign,EmailTemplate template,Set<User> uniqueUsers){
                asyncService.sendEmails(campaign, template, uniqueUsers);

    }
}

AsyncService.java

@Service("asyncService")
@Transactional
public class AsyncService {

private void sendEmailsToContacts(Campaign campaign,EmailTemplate template,Set<User> uniqueUsers){
Integer companyId = 1;
    for(User user:uniqueUsers){
            sendEmailsToContacts(campaign, template, companyId, user);          
        }
}

    private void sendEmailsToContacts2(Campaign campaign, EmailTemplate template, Integer companyId, User user){

        CampaignEmailsHistory history = new CampaignEmailsHistory();
        history.setCampaignId(campaign.getId());
        history.setUserId(user.getUserId());
        history.setSentTime(new Date());
        campaignDao.saveCampaignEmailsHistory(history); 

        mailService.sendMail("sending mail to user here");      


        logger.debug("Exit from sendEmailsToContacts() for ["+user.getEmailId()+"]**********("+campaign.getCampaign()+")");
        logger.debug("---------------------E N D---------------------------------------");
    }
}

当我使用上面的代码时,假设我有5000个用户,则前5000个用户正在接收电子邮件, 然后 CampaignEmailsHistory开始插入数据库。

与其相反,它首先应在数据库中插入一条记录,然后在插入后再向一个用户发送一封邮件。同样的方法应该重复5000个用户。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

这是因为您已经用@Transactional注释了类,这等效于用@Transactional注释了类的每个方法。

调用sendEmailsToContacts()时,数据库事务开始。然后,执行所有数据库插入语句。该方法完成后,将提交事务。仅在提交事务后,作为该事务一部分进行的任何更改对其他客户端都是可见的。如果在执行该方法期间发生任何错误(例如:邮件服务抛出异常),则对数据库所做的所有更改(记录插入)都将回滚。

如果希望每个插入都独立完成,则可以删除类上的@Transactional注释。