RabbitMQ mecanismo mensaje de confirmación: + confirmar la transacción

com.example.demo.util empaquetar; 

importar com.rabbitmq.client. *;

java.io.IOException importación;
java.util.SortedSet importación;
java.util.TreeSet importación;


/ **
* RabbitMQ工具类
*
* @author yangxj
* @date 03/25/2020 20:30
* /
RabbitMQUtils clase pública {
/ **
*获取RabbitMQ连接
*
* @return
* @throws excepción
* /
public static Connection getConnection () throws Exception {
fábrica ConnectionFactory = new ConnectionFactory ();
factory.setHost ( "localhost");
factory.setPort (5672);
factory.setVirtualHost ( "/");
factory.setUsername ( "admin");
factory.setUsername ( "admin");
factory.newConnection retorno ();
}

/ **
* 1. por mecanismos de transacción (desventajas: Las disminuciones rendimiento mq)
* /

useTx public void () throws Exception {
Conexión Conexión = la getConnection ();

Canal Canal connection.createChannel = ();

// Declarar una cola
channel.queueDeclare ( "Test-cola", como false, false, false, null);

cadena de mensaje = "Hola MQ conejo! ";

channel.txSelect (); // transacción abierta

el try {
channel.basicPublish (" "" Test-cola", null, message.getBytes ()); // enviar mensaje
channel.confirmSelect ();// enviar
La captura} (Exception e) {
channel.txRollback (); // Rollback
} {el fin
channel.close ();
channel.close ();
}

}

** /
* 2. Modo de confirmar Fabricante (tipo serie)
* Principio : cuando el canal de canal entra en el modo confrim, todos los mensajes enviados en el canal serán asignados un ID único
* cuando el mensaje se entrega a todos cola a juego, Broker enviará un acuse de recibo al productor (incluyendo ID de mensaje);
* /
producterConfirmSync public void () throws Exception {
conexión de la conexión del getConnection = (); // Obtener RabbitMQ conectado

Canal Canal connection.createChannel = ();

channel.confirmSelect (); // modo abierto confirman

String mensaje = "MQ conejo hola! " ;
cadena mensaje2 = "el conejo MQ2 el ¡Hola!";

channel.basicPublish ( "", "", MessageProperties.BASIC, message.getBytes ());
channel.basicPublish ( "", "", MessageProperties.BASIC, message2.getBytes ());

if (channel.waitForConfirms ()) {//支持多条发送后再确认
System.out.println ( "enviar mensaje de éxito ..");
} Else {
System.out.println ( "enviar mensaje fallar ..");
}
}

/ **
* 3.生产者confirmar模式(异步)
* /
público producterConfirmAsync vacío () throws Exception {
conexión Conexión = getConnection (); //获取RabbitMQ连接

canal Channel = connection.createChannel ();

channel.confirmSelect ();


Los SortedSet <pulsación larga> ackIds = new nueva TreeSet <> ();

// No ACK IDS
SortedSet <pulsación larga> nackIds = new nueva TreeSet <> ();

for (i = 0 int; <100 I; ++ I) {
cadena de mensaje = "Hola MQ conejo: "+ I;
channel.basicPublish (" """, null, message.getBytes ());
}


channel.addConfirmListener (nueva nueva ConfirmListener () {
@Override
public void handleAck (Long deliveryTag, Boolean múltiple) throws IOException {// enviado con éxito (reconocimiento)
// múltiple reconocimiento simple o múltiple de confirmación (true, lo que indica que todos los mensajes anteriores tienen el número de serie ha sido procesada)
ackIds.add (deliveryTag);
}

@ Override
handleNack public void (larga deliveryTag, boolean múltiple) throws IOException {// transmisión falló (no reconocida)
nackIds.add (deliveryTag);
}
});
}

/ **
* Confirmar consumidor
* /
público consumerConfirm vacío () throws Exception {
conexión de la conexión = getConnection (); // obtener RabbitMQ conectados

Canal Canal connection.createChannel = ();

el try {
channel.basicConsume ( "Prueba", false, // apagar automáticamente el ACK del consumidor
nueva nueva DefaultConsumer (Canal) {
@ Override
public void handleDelivery (String consumerTag,
Sobre Sobre,
AMQP.BasicProperties Properties,
byte [] corporal)
lanza IOException {
// liberación de cada mensaje recibirá un canal único deliveryTag, deliveryTag es único dentro del alcance de
largo deliveryTag envelope.getDeliveryTag = ();
// primero dos parámetros son la bandera de acuse de recibo a granel. Si es verdad, se ejecuta el reconocimiento mayor, el mensaje recibido para confirmar antes de que todo deliveryTag;
// si el valor es falso, sólo el mensaje recibido actualmente para confirmar
channel.basicAck (deliveryTag, true); // Confirmar
}
});
} Catch (IOException e) {
e.printStackTrace ();
} finally {
channel.close ();
connection.close ();
}
}



}

Supongo que te gusta

Origin www.cnblogs.com/yangxijun/p/12570828.html
Recomendado
Clasificación