gpt4 book ai didi

java - 仅当使用 spring-transactions 交易成功时如何发送电子邮件

转载 作者:行者123 更新时间:2023-12-04 01:48:35 25 4
gpt4 key购买 nike

我想在数据库中创建一个用户,并在这种情况下向用户发送带有 AWS SES 的电子邮件。

  • 如果用户在数据库中提交事务成功 => 发送电子邮件
  • 如果发送电子邮件 AWS SES 失败(检查异常)=> 回滚数据库中的用户创建
  • 如果用户在数据库中提交事务失败 => 不要使用 AWS
  • 向用户发送电子邮件

    我的代码有问题:如果我的 sendEmail 交易被提交方法抛出异常。

    配置:带有 spring-data-jpa 的 Spring-Boot 项目
    class EmailServiceImpl {   

    @Transactional(rollbackFor = Exception.class)
    @Override
    public User createUserAndSendEmail(UserDto userDto) throws UserEmailException {
    try {
    //rollback userCreation if sendEmail throw a checkedException
    User user = userService.create(userDto);
    sendEmail(user);
    return user;

    } catch (Exception exception) {
    throw new UserEmailException(exception.getMessage());
    }
    }

    //don't send email if userCommit in database failed
    private void sendEmail(User user) {
    amazonEmailService.sendMail(user);
    }
    }

    class UserServiceImpl {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public User create(UserDto userDto) throws Exception {
    User user = mapp(userDto);
    return userRepository.save(user);
    }
    }

    最佳答案

    要在 TX commit 后执行某些操作,您可以使用 @TransactionalEventListenerTransactionPhase.AFTER_COMMIT (默认设置)。将您想要执行的操作放入 TransactionalEventListener :

    使用 ApplicationEventPublisher发布 UserCreatedEvent :

    public class EmailServiceImpl {   

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @Transactional(rollbackFor = Exception.class)
    public User createUserAndSendEmail(UserDto userDto) throws UserEmailException {
    try {
    User user = userService.create(userDto);

    //Publish UserCreatedEvent such the UserCreatedEventHandler can handled it after TX commit
    applicationContext.publishEvent(new UserCreatedEvent(user));

    return user;
    } catch (Exception exception) {
    throw new UserEmailException(exception.getMessage());
    }
    }
    }

    UserCreatedEvent TX 提交后将由此处理程序处理:
    @Component
    public class UserCreatedEventHandler {

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void handle(UserCreatedEvent event) {
    try{
    amazonEmailService.sendMail(user);
    System.out.println("Good, can send email.");
    }catch(Exception exception){
    System.out.println("Sad, fail to send email , so remove user from DB...");
    userService.remove();
    }
    }
    }

    Deinum 的好球。如果你使用我的建议,你必须改变 userService.create()@Transactional(propagation = Propagation.REQUIRES)

    关于java - 仅当使用 spring-transactions 交易成功时如何发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318637/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com