0

保存的数据似乎不适用于在任务中运行的线程,除非它也包含在任务中(grails 2.3.1)。基本测试用例如下,结果是任务外的计数为 1,任务内的计数为 0。如何避免将所有数据保存操作包含在任务中?

@Test
void testMemberSync() {
    String inputMemberData = """{"startMemberNumber" : "1002016", "endMemberNumber" : "",   "memberData": [
        {"membershipNumber":"1002016","key": "1111",  "surname":"tester","forenames":"John","preferredEmail":"jrobens+1777@interlated.com.au","tags": [" """ + CollaborationCategoryEnum.FED_REP.toString() + """ "]},
]}"""

    JSONObject memberParamData = (JSONObject) JSON.parse(inputMemberData)

    memberParamData.memberData.each { member ->
        new MemberUpdateCache(member)
    }

    assert Member.count > 0

    Promise memberDeleteDeltas = task {
        println "Member count in promise is : ${Member.count()}"
        assert Member.count > 0
    }
    memberDeleteDeltas.onError { Throwable err ->
        throw new Exception("task threw error")
    }
}

MemberUpdateCache 只是调用新成员:

public MemberUpdateCache(JSONObject jsonMember) {
  Member newMember = new Member(key: jsonMember.key,
            membershipNumber: jsonMember.membershipNumber,
            surname: jsonMember?.surname,
            forenames: civiForenames,
            preferredEmail: jsonMember?.preferredEmail
    )
    newMember.save(failOnError: true)
}

我无法通过用 withNewSession() 或 withTransaction() 包装创建来让测试用例工作。"flush:true" 也不起作用。

将创建包装在另一个任务中确实有效:

Promise createMemberPromise = task {
        Member.withTransaction { status ->
            memberParamData.memberData.each { member ->
                new MemberUpdateCache(member)
            }
        }
    }
    waitAll createMemberPromise

    assert Member.count > 0
...
4

1 回答 1

0

将创作包装在另一个任务中是可行的。可能会导致错误 - 但我还没有找到另一个答案。因此,所有相关的数据都需要一个任务。

Promise createMemberPromise = task {
    Member.withTransaction { status ->
        memberParamData.memberData.each { member ->
            new MemberUpdateCache(member)
        }
    }
}
waitAll createMemberPromise

assert Member.count > 0
于 2013-12-11T02:18:18.973 回答