私はパラレルサービスをプログラミングするのに苦労しています。目標は、非同期APIコールを使用してFacebookからデータを取得し、その後、GORMアクションを同期的に実行して、取得したデータを繰り返し処理することです。Grails:非同期Webリクエスト後にオブジェクトをDBに保存する方法は?
データをフェッチする最初のステップは、非同期で正常に動作するようです:
List<Activity> activityList = Activity.findAllByFacebookPageIsNotNullAndFetchEvents(true, [max: 100])
PromiseList promiseList = new PromiseList()
activityList.each { Activity activity->
promiseList << { fetchEventData(activity.facebookPage, null) }
}
のように今私は、結果を反復処理しようとしています:createEvent()
方法はしようとし
promiseList.onComplete { List results ->
results.each { ArrayList eventSet ->
eventSet.each { LazyMap eventData ->
createEvent(eventData)
}
}
}
新しいEvent
を保存してください。この操作はで失敗します。
2017-04-11 10:56:47.018 ERROR --- [ctor Thread 129] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after statement closed. 2017-04-11 10:56:47.024 ERROR --- [ctor Thread 124] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after statement closed. 2017-04-11 10:56:47.024 ERROR --- [ctor Thread 125] o.h.engine.jdbc.spi.SqlExceptionHelper : Cannot convert value '2017-01-11 23:31:39' from column 3 to TIMESTAMP. 2017-04-11 10:56:47.025 ERROR --- [ctor Thread 105] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after statement closed. 2017-04-11 10:56:47.026 ERROR --- [ctor Thread 103] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after statement closed. 2017-04-11 10:56:47.026 ERROR --- [ctor Thread 107] o.h.engine.jdbc.spi.SqlExceptionHelper : No operations allowed after statement closed.
だから私はcreateEvent()
がさまざまなスレッドの代わりに「メイン」スレッドから呼び出されると思います。
誰かがこれを正しい方法で教えてもらえますか?
編集:
私も試してみました:
List<ArrayList> promiseResult = promiseList.get()
promiseResult.each { ArrayList<LazyMap> eventList ->
eventList.each {
Event.findByFacebookId((String) it['id'])
//createEvent(it)
}
}
がjava.lang.NullPointerException
このコードが呼び出されていますか?新しいスレッドごとに、Eventを使用して新しいGORMトランザクションを作成する必要があります。 withNewTransaction {//ここに更新コード} –
トランザクションサービスです。 – Fmeuer
今私はエラーなしで 'withNewTransaction {}'を使用しています:-)しかし、オブジェクトはDBに永続化されません。 '.save(flush:true、failOnError:true)'を使う – Fmeuer