07.RabbitMQメッセージの成功確認メカニズム
-
実際のシナリオでは、一部のプロデューサーによって送信されたメッセージがメッセージキューに正常に送信されることが保証されている必要があります。それでは、確実に配信を成功させるにはどうすればよいでしょうか。
-
- トランザクションメカニズム
- リリース確認メカニズム
1.トランザクションメカニズム
-
AMQPプロトコルによって提供されるメッセージの配信を成功させ、チャネルを介したトランザクションモードを有効にする方法
-
また、チャネルの3つの方法を使用して、トランザクション方式でメッセージを送信します。送信が失敗した場合、トランザクションは例外処理によってロールバックされ、メッセージが正常に配信されるようになります。
-
- channel.txSelect():トランザクションを開く
- channel.txCommit():トランザクションをコミットします
-
- channel.txRollback():トランザクションをロールバックします
-
Springは上記の3つのメソッドをカプセル化しているため、元のコードデモンストレーションのみを使用できます
2.プロデューサーコード
package trascation;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import util.ConnectionUtil;
/**
* @author WeiHong
* @date 2021 - 09 - 15 19:59
*/
public class Sender {
public static void main(String[] args) throws Exception {
//1.获取连接
Connection connection = ConnectionUtil.getConnection();
//2.在连接中创建信道
Channel channel = connection.createChannel();
//3.声明路由
channel.exchangeDeclare("trascation_exchange_topic","topic");
//4.发送消息
channel.txSelect(); //开启事务
try {
channel.basicPublish("trascation_exchange_topic","user.weihong",null,"商品1-降价".getBytes());
System.out.println(3/0);//模拟异常
channel.basicPublish("trascation_exchange_topic","user.libai",null,"商品2-降价".getBytes());
channel.basicPublish("trascation_exchange_topic","users123.wangwu",null,"商品3-降价".getBytes());
System.out.println("生产者已发送!");
channel.txCommit();//事务提交
}catch(Exception e){
System.out.println("由于系统异常,消息全部撤回!");
channel.txRollback();//事务回滚
e.printStackTrace();
}finally {
channel.close();
connection.close();
}
}
}
3.消費者コード
package trascation;
import com.rabbitmq.client.*;
import util.ConnectionUtil;
import java.io.IOException;
/**
* @author WeiHong
* @date 2021 - 09 - 15 20:10
*/
public class Recer1 {
public static void main(String[] args) throws Exception {
//1.创建连接
Connection connection = ConnectionUtil.getConnection();
//2.在连接中创建信道
Channel channel = connection.createChannel();
//3.声明队列
channel.queueDeclare("trscation_queue_topic1",false,false,false,null);
//4.绑定路由
channel.queueBind("trscation_queue_topic1","trascation_exchange_topic","user.#");
//5.定义内部类接收消息
DefaultConsumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String msg = new String(body);
System.out.println("消费者1="+msg);
}
};
channel.basicConsume("trscation_queue_topic1",true,consumer);
}
}