1

私たちは、何千通もの電子メールの送信を担当する、春のバッチ化された Hibernate ベースのアプリケーションを開発しています。

つまり、現在、1 つのステップで定義された 1 つのジョブがあります。

<job id="emailJob" xmlns="http://www.springframework.org/schema/batch" restartable="true"
     job-repository="jobRepository">
    <step id="emailJobFetchUsers">
        <tasklet>
            <chunk reader="emailItemReader" processor="emailItemProcessor" writer="emailItemWriter" commit-interval="1"/>
        </tasklet>
        <end on="COMPLETED"/>
        <fail on="FAILED"/>
    </step>
    <listeners>
        <listener ref="loggingListener"/>
    </listeners>
</job>
  • emailItemReader は HibernateCursorItemReader を拡張し、行のエンティティ (この場合、顧客が選択した電子メールを表すレコード) を返します。
  • emailItemProcessor は顧客固有の電子メールを生成して送信します
  • emailItemWriter は、最終送信日などの情報を持つエンティティを単純に更新します

これは機能しますが、すべてが1つのステップであるべきなのか、それとも各アクションに1つのステップが必要なのかはわかりません. 私の主な関心事は、再起動可能性と回復に関するものです。つまり、このような例外が 1 人のユーザーに対して発生する (無効な電子メール アドレスまたは電子メールの生成の問題が原因である可能性があります)、またはアプリケーション サーバーがダウンして再起動された場合、送信された場所から電子メールを受信できるようにする必要があります。オフ。

誰でも上記についてアドバイスできますか?

ありがとう、

4

1 に答える 1

0

はい、再起動できるはずです。リーダーのスーパークラスの javadoc を確認してください。ただし、次の点に注意する必要があります。

  • クエリの順序を維持する必要があります-リーダーは失敗したアイテムから開始するため、各クエリの実行は同じ順序でアイテムを返す必要があります
  • itemWriter でのエンティティの変更がクエリの結果に影響する場合は注意が必要です。最終送信日でフィルタリングすると、期待どおりに機能しません。

さらに、次のことが起こった場合は、次のようになります。

  1. ジョブの実行が失敗する
  2. 新しい顧客が DB に挿入されます\
  3. 仕事が再開する

その場合、クエリの結果も、最初の (失敗した) 実行時とは異なる場合があります。アプリでそのようなシナリオが可能である場合は、それを防ぐためにいくつかの条件を追加することをお勧めします。最初のジョブ実行時間以降に登録された顧客をスキップするようにクエリにチェックを追加するなどです。

于 2013-03-02T00:38:25.747 に答える