CODE-264 スケジュール機能
-
Vueで通知を実装できるか (5h)
- Web Pushだと微妙か
- client始動にしたい
- リアルタイム
- pollingが丸いか(
setInterval&clearInterval) - Web Socket? or gRPC
- BE: SpringなのでSocket.ioは使えない
- pollingが丸いか(
- 非リアルタイム
- ページ読み込み時にDB問い合わせ
- localStorage
- リアルタイム
- or Springでcron
Spring Boot 定期実行
-
@EnableScheduringで可能 -
掲載期限の1日前をクエリで検索したい
\d dealsjava.util.DateはJPAでpostgreSQLのtimestamp without time zoneに変換されるらしい
-
クエリに日付の範囲検索を取り入れたい
- どうやってJPAにマップさせるのか
-
-> 今は調査なのでタスクが大きくなりそうなので
DealEntityRepositoryに専用のメソッド生やす- Spring Data JPA でのクエリー実装方法まとめ - Qiita
@Queryでできそうか- JPQLは時間操作対応していないのでnative query必要
::intervalは\:\:intervalとエスケープする
- JPQLは時間操作対応していないのでnative query必要
- sql - DateAdd function not support in jpa query - Stack Overflow
- Spring Data JPA でのクエリー実装方法まとめ - Qiita
-
一時的なテストファイル作ってメソッドの戻り値を確認しながら実装するのいいな yoi
-
冪等性
- intervalとの関係性
- interval=1h ->
period <@ [now() + 23h, now() + 24h) - cons: cronがダウンしていたら通知されない依頼が出てくる
- pros: 手軽
- interval=1h ->
- フラグ
- DB増える, 面倒くさい
- intervalとの関係性
PR
# 修正内容
- 掲載期限の通知バッチ, 取引期限を通知バッチとテストの実装を致しました。
どちらも毎時(cron = `0 0 * * * *`)定期実行され、どちらも期限日まで24時間を切ったら通知を追加する仕様となっています。
また、取引ダミーデータ投入処理(`DealSeeder`) のリファクタリング(ランダム性を無くし, 網羅的に生成されるように) をしました。
## (追記) `application.yaml` への設定値の追加について
バッチ毎に設定値をまとめてあります。
```yaml
batch:
# 掲載期限通知
notify-published-period-approaching:
cron: "0 0 * * * *"
# cronの実行間隔(sec)
cron-interval-sec: 3600
# 何秒後の期限切れを通知するか(sec)
notify-before-sec: 86400
# 取引期限通知
notify-deal-end-time-approaching:
cron: "0 0 * * * *"
# cronの実行間隔(sec)
cron-interval-sec: 3600
# 何秒後の期限切れを通知するか(sec)
notify-before-sec: 86400
# 取引開始から終了までの秒数(デフォルト: 7日間 = 604800sec)
published-period-expired-sec: 604800
```
## EntityRepositoryの実装について
ざっと調査した限りではJPQLは日付の演算に対応していないようなので`DealEntityRepository.findByDealStartTimeBetweenAndDealStatusesIn()` はnative query(PostgreSQL依存)として書いています。
お手すきの際にご確認お願いします。