1

我有一个我想向其发送邀请电子邮件的用户列表,在我发送电子邮件后,我想将该人保存在一个单独的表中,这样万一服务器出现故障,我们就不会发送双重电子邮件,因为我们知道谁是我们发送电子邮件的最后一个人。这是代码:

@play.db.jpa.NoTransaction
public void sendInvite() {
    Long lastUser = (Long) User.find("select MAX(id) from User").fetch().get(0);
Long lastId = (Long) Contact.find("select MAX(id) from Contact").fetch().get(0);

    for (i=lastContacted; i < totalNumUsers; i++) {
        UserContact  contact = new UserContact();
        contact.firstName = user.firstName;
        contact.lastName = user.lastName;
        contact.email = user.email;
        if (validateEmail(user) == false) {
            continue;
        }
       sendInviteEmail(user);
       saveContact(contact); //THIS DOESN'T TAKE PLACE UNTIL END OF THE LOOP
       Thread.sleep(2000);
    }
}

问题是保存的联系人直到 for 循环结束才保存在数据库中。我努力了:

contact.em().persist(contact);
contact.em().flush();

但这也不起作用
*我还想补充一点,该方法是从作业而不是从控制器运行的。

4

1 回答 1

2

如果您在事务中执行所有这些操作,并且服务器出现故障,则不会提交事务,即使您在事务期间刷新,也不会将任何内容写入数据库。面对每个联系人,您需要打开一个新事务,将联系人保存在这个新事务中,然后提交事务。

于 2012-05-16T17:53:20.417 回答