簡體   English   中英

Grails 異步事件處理程序無法從持久性中檢索域實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM