Spring @async с несколькими действиями

#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 аннотацию в вашем классе.