[英]Grails async Event handler fails to retrieve domain instance from persistence
我正在嘗試在事務服務中創建和保留Foo
實例,然后一旦Foo
實例被持久化,就觸發一個事件以啟動一些異步處理。
我遇到的問題是,當我嘗試從事件處理程序中的持久性中檢索Foo
實例時,找不到該實例。
我保留Foo
實例的服務方法如下所示:
Foo makeFoo() {
def foo = new Foo(...).save(flush: true, failOnError: true)
notify("FOO_CREATED_EVT", foo.id)
return foo
}
我的事件處理程序存在於單獨的事務服務中,如下所示:
@Selector("FOO_CREATED_EVT")
void onFooCreated(Long fooId) {
def foo = Foo.get(fooId) // also tried findById, with the same outcome
assert foo != null // fails
}
我已經在啟用 sql 日志記錄的情況下逐步完成了兩邊的代碼,並驗證了Foo
實例成功地持久保存在makeFoo()
,但是當onFooCreated()
嘗試檢索它時,它總是失敗。 據我所知,在觸發事件之前刷新保存應該會導致立即保留Foo
實例,但是如果我在 onFooCreated 中添加延遲:
Thread.sleep(1000)
def foo = Foo.get(fooId)
assert foo != null // succeeds
然后操作成功,所以我只能假設存在競爭條件,因為刷新實際上並沒有同步持久化實例。
我的項目使用帶有 Hibernate 5 和 PostgreSQL 9.6 的 Grails 3.2。
我顯然做錯了什么,但是關於異步事件的文檔非常稀少,並且在對這種情況進行故障排除時遇到了麻煩:(
flush()
可能已執行,但事務尚未提交或關閉,因此數據對另一個線程不可見,因為事務是隔離的,另一個線程將使用單獨的連接。
在觸發事件之前,您需要確保事務已提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.