Ja používam axon rámca s jar boot verzia
compile("org.axonframework:axon-spring-boot-starter:4.3.3") {
exclude group: 'org.axonframework', module: 'axon-server-connector'
}
Nedávno som si začala všímať určité business workflow zastaviť a zrazu, keď som čítal denníky som našiel tento výnimkou
Command 'com.example.MyCommand' resulted in org.axonframework.common.lock.LockAcquisitionFailedException(Failed to acquire lock for aggregate identifier(AGG_ID), maximum attempts exceeded (100))
Toto začalo vyskytujúce sa náhle a jeho stále častejšie s časom.
Súhrnná je nakonfigurovaný na používanie snapshotting
@Bean public SnapshotTriggerDefinition MyAggregateSnapshotTriggerDefinition(Snapshotter snapshotter) {
return new EventCountSnapshotTriggerDefinition(snapshotter, 200);
}
Tento agregát má iba niekoľko inštancií a zostávajú nažive pre veľmi dlhé časové obdobie (roky)
Čítal som, že táto výnimka je vyvolaná, ak proces sa zdá podržte tlačidlo zámku na súhrnné až príliš dlho, zatiaľ príkaz požadované zámok a timeouted čaká na to.
Celková nemá veľké množstvo údajov
@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;
...
}
ŽIADNE príkazy odoslané do tejto súhrnnej sú zasielané v "sendAndWait" režime.
Všetky príkazy, ktoré majú malé zaťaženie a nie je ťažké výpočet sa deje v príkazovom riadku Obslužný metódy. Jeho litreally kontrolu niektorých boolean vlajky a informačných podujatí.
V prípade objednania popisovače na druhej strane si niektorí logiky. Oni manipulovať rezervácie frontu do volebnej miestnosti a vkladanie rezervácie.
@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
}
Podivné veci, ako dobre, som skontroloval iných miest, kde sa to isté výnimkou je hodená a oni sa zdá, že všetci majú rovnaké chybové hlásenie, ale tá moja je len to, že má iný počet pokusov (100)
LockAcquisitionFailedException:
Failed to acquire lock for aggregate identifier(AGG_ID),
maximum attempts exceeded (2147483647)
Čítal som, kód PessimisticLockFactory a bol schopný pochopiť, že toto číslo (2147483647) predstavuje počet krát proces sa snažil získať zámok na agregovanom.
Prečo je 100 len v mojom prípade? (ŽIADNE ďalšie config bol pridaný z mojej strany)
Ako to môžem vyriešiť tento problém? ako môžem sledovať zámky na súhrnné? ako vedieť, aký proces aquired token a nechcel vydať ju?