Nella nostra applicazione abbiamo diverse transazioni, in cui ogni passaggio viene registrato estesamente.
Pseudocodice:
@Component
public class OurServiceImpl implements OurService {
...
@Transactional
public void doComplexTransaction(...){
String transactionId = generateTransactionId(userid, date)
log.info("==========================Start Transaction" + transactionId);
log.info("Doing A");
doA(..., transcationId);
log.info("Doing B");
doB(..., transcationId);
log.info("Doing C");
doC(... transcationId);
log.info("==========================End Transaction" + transactionId);
}
...
public void doA(..., transactionId){
...
log.info("Doing SubA "+transactionId);
doSubA();
}
}
Poiché la registrazione è fonte di distrazione, abbiamo deciso di utilizzare AOP per questo.
Il metodo doComplexTransaction(..) potrebbe essere coperto con @Around(execution(FQN.doComplexTransaction(..)))
Le chiamate doA() , doB() e doC() potrebbero essere rielaborate in un'altra classe, quindi potrebbero essere coperte con @Around allo stesso modo.
Ma poi si verifica il seguente problema:
Come passare transcationId (generato in un consiglio) tra diversi consigli ?
O più generale:
Come progettare "logging transazionale (con identificatore)" su più richiami di metodo e oggetti?
Potrebbe essere fatto con Spring-AOP ?
Il mio obiettivo è discernere le diverse transazioni simultanee nel mio log, il che renderebbe facile l'interrogazione tramite elasticsearch et al.
Bruteforce-soluzione:
(simile a Steve Park's)
Un'idea, che avevo, stava generando il transactionId nel primo consiglio e la "inietta" per ulteriori chiamate in proceedingJoinPoint.proceed(..., transactionId). In any further advice, I could extract the transactionId via .getArgs () and inject it in the proceed () '- call.
Ma questo ha due aspetti negativi:
1) È esteticamente non piacevole o semplicemente: scomodo. È un hack, anche se funzionante.
2) Ciò viola diversi principi di progettazione, in primo luogo: il principio del minimo stupore . Se un recensore guarda il POJO e vede una variabile passata ma mai "usata" - grazie ad AOP - sarebbe almeno stupito .
Quindi, sì, quella è una soluzione, ma sto cercando una soluzione migliore.