Ahoj, som na jarnej dávke nový.
Mám situáciu s jarnou dávkou, ako je uvedené nižšie:
Musím spustiť dávku pre všetky propagácie [Zoznam propagácií]
Pre každú propagáciu potrebujem pripraviť dynamický dotaz s atribútmi propagácie a získať celú históriu transakcií a vypočítať propagačné body každému používateľovi
A tu s vyššie uvedeným dynamickým dotazom som chcel prečítať znova z dávky, pretože vracia výsledky minimálne 50 tisíc záznamov.
Nižšie je uvedený postup, ktorý očakávam, je to možné v jarnej dávke?
- Čítať propagačné akcie [Čitateľ prečíta propagácie jeden po druhom]
- vytvoriť dotaz a dať ho do kontextu
- odovzdať ho ďalšiemu čitateľovi
- číta transakcie jeden po druhom
- spracovávať transakcie a počítať body
- procesor
Môj problém je tu: Nie je možné zapisovať vnorené kusy [jeden pre propagácie čítania a jeden pre čítanie transakcií].
Jednou z alternatív je:
Rozdeľte prácu pre každú propagáciu, v ktorej budú všetky propagácie prebiehať súbežne. Potrebujeme však spustiť jednu po druhej.
Môže na to nejaký orgán navrhnúť nejaký spôsob?
odpovede:
1 pre odpoveď č. 1Nemôžete mať vnorený kus, takže môžete kódovať svoj vlastný CompositeItemReader (pseudokód):
class CompositeItemReader implements ItemReader<Transaction> {
ItemReader<Promotion> promotions;
ItemReader<Transaction> transactions;
public void setPromotions(ItemReader<Promotion> promotions) {...}
public Transaction read() {
Transaction item = transactions.read();
if(null == item) {
Promotion p = promotions.read();
if(null != p) {
// Close transactions reader, create dynamic query and open transaction reader
// Re-read item!
item = this.read();
}
}
return item;
}
}
ale nezabudnite zaregistrovať propagácie a transakcie ako stream a nezabudnite spravovať reštart.
Ak ste si istí, že každá propagácia má obmedzený zoznam pridružených transakcií, môžete použiť a ItemProcessor<Promotion,List<Transaction>>
ktoré prevádzajú jednu propagačnú akciu (čítacie jednotky založené na dopyte):
class PromotionProcessor implements ItemProcessor<Promotion,List<Transaction>> {
public List<Transaction> process(Promotion item) {
Query q = <create dynamic query>;
return q.list();
}
}
Else riešenie založené na PeekableItemReader a držiteľ údajov, ako je popísané tu
Dúfam, že tieto úvahy môžu byť užitočné! Dobrá práca!