Cómo operar de forma asíncrona después de confirmar la transacción Spring
Utilice TransactionSynchronizationManager para operar después de la confirmación de la transacción
public void insert(TechBook techBook){
bookMapper.insert( techBook);
// envía después de la confirmación de tx pero es asíncrono
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
System.out.println("enviar correo electrónico después de confirmar la transacción...") )
}
}
);
ThreadLocalRandom random = ThreadLocalRandom.current();
if(random.nextInt() 2 == 0){
throw new RuntimeException("transacción de correo electrónico de prueba ");
}
System.out.println("final del servicio");
}
Este método habilita Es es posible realizar operaciones después del envío
Operación asincrónica
Utilice mq o grupo de subprocesos para la asincronización, por ejemplo, utilice el grupo de subprocesos:
private final ExecutorService executorService = Ejecutores .newFixedThreadPool(5);
public void insert(TechBook techBook){
bookMapper.insert(techBook);
//Enviado después de enviar el tx, pero asíncrono
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
executorService .submit (new Runnable() {
@Override
public void run() {
System.out.println("enviar correo electrónico después de confirmar la transacción... ");
prueba {
Thread.sleep(10*1000);
} catch (InterruptedException e) {<
/p>
e.printStackTrace();
}
System.out .println("completar envío de correo electrónico después de confirmar la transacción...") )
}
});
}
}
}
// Async funciona, pero tx no funciona, se ejecutará incluso cuando tx retroceda
// asyncService.executeAfterTxComplete()executeAfterTxComplete();
ThreadLocalRandom aleatorio = ThreadLocalRandom.current();
if(random.nextInt() 2 == 0){
throw new RuntimeException("transacción de correo electrónico de prueba");
}
System.out.println("fin del servicio");
}