Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yusukeiwaki/delayed_job-rollback-playground
https://github.com/yusukeiwaki/delayed_job-rollback-playground
Last synced: about 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/yusukeiwaki/delayed_job-rollback-playground
- Owner: YusukeIwaki
- Created: 2018-05-09T00:59:39.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-05-09T04:17:40.000Z (over 6 years ago)
- Last Synced: 2024-10-18T08:32:52.651Z (3 months ago)
- Language: Ruby
- Size: 24.4 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Delayed::Job playground.
モデルのafter_createでベタに通知をしちゃうと、モデルがロールバックされた時に通知はロールバックできなくて詰む。
```
class User
after_create :notify_created
def notify_created
# 通知を送る機能
# 作るのが面倒なので、RequestBinに `type: notify_created` でアクセスするようにした
end
def verify
# 本人確認機能
# 作るのが面倒なので、RequestBinに `type: identity_verification` でアクセスするようにした
# 成功時には、UserにひもづいてUserIdentityVerificationレコードを作る
# 失敗時には、例外を投げる
end
endclass UsersController
def create
User.transaction do
user = User.create!(params.require(:user).permit(...))
user.verify
end
end
end
```たとえばこれだと、
```
user = User.create!(params.require(:user).permit(...))
```の時点で、after_createが呼ばれるので、本人確認に失敗して、最終的にトランザクションのロールバックをしたとしても
`type: notify_created` のリクエストがRequestBinに記録されてしまう。
## Delayed::Job使うとどうなる?
ふつうに考えればafter_commitでやるようにするとか、サービスクラス作るとか、いろいろ手段はあるけど、とりあえず今回はDelayed::Jobの検証が目的なのでDelayed::Jobを使う。
```
class User
after_create do |record|
record.delay.notify_created
end
```これにより `notify_created` はいつ実行されるようになるのか?
本人確認に5秒かかったとしても、そのあとで通知されるようになるの??というのを検証したかった。結論から言うと、確実に本人確認が済んでトランザクションを抜けた後に、notify_createdが呼ばれるようになった。
本人確認でコケたときには、notify_createdは実行されなくなった。予想だけど、Delayed::Jobのデキューがafter_commit的な契機で行われているのではないかなと。