这是我的代码:
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个用户。
有人可以帮我吗?
答案 0 :(得分:0)
这是因为您已经用@Transactional
注释了类,这等效于用@Transactional
注释了类的每个方法。
调用sendEmailsToContacts()
时,数据库事务开始。然后,执行所有数据库插入语句。该方法完成后,将提交事务。仅在提交事务后,作为该事务一部分进行的任何更改对其他客户端都是可见的。如果在执行该方法期间发生任何错误(例如:邮件服务抛出异常),则对数据库所做的所有更改(记录插入)都将回滚。
如果希望每个插入都独立完成,则可以删除类上的@Transactional
注释。