Spring Batch メカニズムはかなり新しいものです。なんとか起動して実行することはできましたが、私のビジネス ロジックは Spring Batch ジョブとして適合していないようです。説明させてください:
ジョブは、次のようにユーザーに電子メールを送信する責任があります。
- 特定の基準を満たすニュース項目のセットを取得します (
Set<News>
) - ニュース項目のいずれかをまだ受け取っていないユーザーのセットを取得します (
Set<User>
) - ユーザーごとに、ユーザーが受信していないニュースごとに電子メールを送信します。
- ニュースが受信されたことをユーザーに「タグ付け」します。
エンティティ Bean の定義は次のとおりです。
@Entity
public class News {
...
// ID with a sequence generator (more recent news have a higher ID value)
private Integer id;
...
}
@Entity
public class User {
...
// last received news;
private Integer lastReceivedNewsId;
...
}
間に 1 対多の関係はないため、未受信のニュースを取得するには、次のように取得できます。
SELECT n FROM db.news n
JOIN User u on n.id > u.lastReceivedNewsId;
私のユーザーベースは現在 28,000 人であり、ステップ 1 と 2 を として、ItemReader
ステップ 3 と 4 を として設定しているため、Spring Batch を使用することにしましたItemWriter
。
問題は、最初の 2 つのステップにあります。JpaPagingItemReader<T>
リーダーとして使用することにしましたが、残念ながら、結果セットを別のものにマッピングする変更なしでクエリを指定することしかできないため、非常に厳格です。この例では、最初に一連のニュースをフェッチし、次にデータベースにクエリを実行して、受信したニュースに基づいて一連のユーザーをフェッチする必要があります ( Tuple<User, Set<News>>
)。
リーダーがユーザーのタプルと未受信のニュースのセットを返せるようにするにはどうすればよいですか? 私は何が欠けていますか?
とても有難い。さらに情報が必要な場合はお知らせください。