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.