Používám axon rámce spring boot verze
compile("org.axonframework:axon-spring-boot-starter:4.3.3") {
exclude group: 'org.axonframework', module: 'axon-server-connector'
}
V poslední době jsem si začal všímat určitých podnikových procesů, zastavení najednou, a když jsem zkontroloval protokoly, které jsem našel tuto výjimku
Command 'com.example.MyCommand' resulted in org.axonframework.common.lock.LockAcquisitionFailedException(Failed to acquire lock for aggregate identifier(AGG_ID), maximum attempts exceeded (100))
To začalo, náhle se vyskytující a jeho stále častější s časem.
Agregát je nakonfigurován pro použití snapshotting
@Bean public SnapshotTriggerDefinition MyAggregateSnapshotTriggerDefinition(Snapshotter snapshotter) {
return new EventCountSnapshotTriggerDefinition(snapshotter, 200);
}
Tento agregát má jen pár spuštěné instance a zůstávají naživu po velmi dlouhou dobu (roky)
Četl jsem, že tato výjimka je vyvolána, pokud se zdá, že proces drží zámek na agregátní příliš dlouho, mezitím příkaz zámek požadované a timeouted čeká na to.
Celkové nedrží velké množství dat
@Aggregate(snapshotTriggerDefinition = "MyAggregateSnapshotTriggerDefinition")
public class MyAggregate {
@AggregateIdentifier
private String aggId;
private boolean paused;
private int pausingChangelist;
private RequestCause pauseCause; //enum
private Seat seat;
private Queue<Reservation> reservationQueue;
private boolean canPauseBuildPool;
...
}
ŽÁDNÝ z příkazů odesláno k tomuto součtu jsou odeslána v "sendAndWait" režimu.
Všechny příkazy mají malý náklad a tam je žádné těžké počítání provádí na povel Psovoda metody. Jeho litreally kontrola některé boolean vlajky a zvyšování událostí.
Událost sourcing manipulátory na druhou stranu udělat nějakou logiku. Manipulují fronty rezervace dotazováním a vložení rezervace.
@EventSourcingHandler
public void on(CertainEvent event) {
// poll from queue if not empty
// raise SeatReservedEvent
}
@EventSourcingHandler
public void on(SeatReservedEvent event) {
// reserve seat
}
@EventSourcingHandler
public void on(SeatFreedEvent event) {
// free the seat
// poll from queue
// if queue not empty -> raise SeatReservedEvent
}
@EventSourcingHandler
public void on(SeatReservationQueuedEvent event) {
// add to queue
}
Divné na tom stejně, zkontroloval jsem ostatní příspěvky, kde to stejná výjimka je vyvolána, a že se zdá, všichni mají přesně stejná chybová zpráva, ale ta moje je jediná, která má jiný počet pokusů (100)
LockAcquisitionFailedException:
Failed to acquire lock for aggregate identifier(AGG_ID),
maximum attempts exceeded (2147483647)
Četl jsem kód PessimisticLockFactory a byl schopen pochopit, že toto číslo (2147483647) představují počet, kolikrát se proces pokusil získat zámek na agregát.
Proč je 100 jen v mém případě? (ŽÁDNÉ dodatečné konfigurace byl přidán z mé strany)
Jak mohu vyřešit tento problém? jak mohu sledovat zámky na agregátní? jak vědět, co zpracovat získané token a nechtěl ji pustit?