#java #spring
#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 пользователей получают электронные письма и
Затем
Начинается вставка истории почтовых сообщений Campaign в базу данных.
Вместо этого сначала он должен вставить одну запись в базу данных, а после вставки только тогда он должен отправить одно электронное письмо одному пользователю. таким же образом это должно повториться для 5000 пользователей.
Кто-нибудь может мне помочь, пожалуйста.
Ответ №1:
Это потому, что вы аннотировали класс с помощью @Transactional
, что эквивалентно аннотированию каждого метода вашего класса с помощью @Transactional
.
При sendEmailsToContacts()
вызове запускается транзакция базы данных. И затем выполняются все инструкции вставки базы данных. Когда метод завершается, транзакция фиксируется. Только после фиксации транзакции любые изменения, внесенные в рамках этой транзакции, видны другим клиентам. Если во время выполнения метода возникает какая-либо ошибка (например, почтовая служба выдает исключение), все изменения, внесенные в базу данных (вставки записей), отменяются.
Если вы хотите, чтобы каждая вставка выполнялась независимо от других, вы можете удалить @Transactional
аннотацию в вашем классе.