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 に答える