Red de conocimiento informático - Material del sitio web - Cómo operar de forma asíncrona después de confirmar la transacción Spring

Cómo operar de forma asíncrona después de confirmar la transacción Spring

Solución de implementación

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");

}