RabbitMQのメッセージの確認応答メカニズム:+トランザクションを確認します

パッケージcom.example.demo.util。

輸入com.rabbitmq.client *。;

インポートにjava.io.IOException;
輸入java.util.SortedSet;
輸入java.util.TreeSet;


/ **
* RabbitMQの工具类
*
* @author yangxj
* @date 2020年3月25日夜8時30分
* /
パブリッククラスRabbitMQUtils {
/ **
*获取のRabbitMQ连接
*
* @return
* @throws例外
* /
パブリック静的接続のgetConnection ()例外{スロー
ConnectionFactoryの工場=新規のConnectionFactory()。
factory.setHost( "localhost"を);
factory.setPort(5672)。
factory.setVirtualHost( "/");
factory.setUsername( "ADMIN");
factory.setUsername( "ADMIN");
戻りfactory.newConnection();
}

/ **
*トランザクションメカニズム(短所:減少スループットMQ)1.
* /

パブリック無効useTx ()例外{スロー
;接続の接続=のgetConnection()

チャネルチャネルconnection.createChannel =();

//キュー宣言
channel.queueDeclare(falseに、falseに、falseに、 "テスト・キュー"、NULL);

文字列メッセージ=「こんにちはMQうさぎ! ";

channel.txSelect(); //開いているトランザクション

のtry {
channel.basicPublish(" ""テスト・キュー」、ヌル、message.getBytes()); //送信メッセージ
channel.confirmSelect();//提出
キャッチ}(例外E){
channel.txRollback(); //ロールバック
} {最後に
channel.close();
channel.close();
}

}

/ **
* 2メーカー確認モード(シリアルタイプ)
*原理:チャネルチャネルはconfrimモードに入ると、チャネルに投稿されたすべてのメッセージは固有のIDが割り当てられます
メッセージが全て一致するキューに配信されている*、ブローカは、(メッセージIDを含む)をプロデューサに肯定応答を送信します。
* /
公共のボイドproducterConfirmSyncは()例外{スロー
接続の接続=のgetConnectionを(); // RabbitMQのは、接続取得

チャンネルチャンネルconnection.createChannelを=();

channel.confirmSelect(); //オープンモードの確認

文字列メッセージ= "ハローラビットMQ! " ;
文字列のメッセージ2 =「うさぎMQ2こんにちは!」。

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

(channel.waitForConfirms()){//支持多条发送后再确认場合
のSystem.out.println( "メッセージの送信成功..");
} {他
のSystem.out.println( "メッセージ送信失敗..")。
}
}

/ **
* 3生产者確認模式(异步)
* /
公共ボイドproducterConfirmAsync()例外{スロー
接続の接続=のgetConnectionを(); //获取RabbitMQの连接

チャンネルチャンネル= connection.createChannel();

channel.confirmSelect();


SortedSet <ロング> ackIds =新しい新しいTreeSetの<>();

//未ACK IDS
たSortedSet <ロング> nackIds =新しい新しいTreeSetの<>();

のため(int型私は= 0; I <100; I ++){
文字列メッセージ=「こんにちはMQラビット: "+ I;
channel.basicPublishは、(" ""」、NULL、message.getBytes());
}


channel.addConfirmListener(新新ConfirmListener(){
@Override
ます。public void handleAck(ロングdeliveryTag、複数の論理値)にIOExceptionがスローされます{//正常(肯定応答)が送信
//複数の単一または複数の確認応答(真、すべての以前のメッセージはシリアル番号が処理されたことを示す)
ackIds.add(deliveryTagを);
}

@Override
公共ボイドhandleNack(長いdeliveryTag、ブール複数の)にIOExceptionが{//スロー(未確認の)送信失敗
; nackIds.add(deliveryTag)
}
});
}

/ **
*消費者を確認
* /
公共ボイドconsumerConfirm()例外をスロー{
接続の接続=のgetConnection(); // RabbitMQのは、接続取得

チャンネルチャンネルconnection.createChannelを=();

試み{
channel.basicConsume( "テスト"、falseに、//が自動的に消費者のACKオフにし
、新たな新DefaultConsumer(チャンネル){
@Override
公共ボイドhandleDelivery(文字列consumerTag、
エンベロープエンベロープ、
AMQP.BasicPropertiesプロパティ、
バイト[]本体)
にIOException {スロー
各メッセージの//放出はユニークdeliveryTag、deliveryTagチャネルはの範囲内で一意で受信する
ロングdeliveryTag envelope.getDeliveryTag =();
//最初の2つのパラメータは、バルク確認フラグです。、バルク確認が実行されたtrueの場合、すべてのdeliveryTag前に確認するために、受信したメッセージ;
//値がfalseの場合は、確認のためのみ、現在受信したメッセージ
channel.basicAck(、真deliveryTag); //確認
}
})。
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}最後に{
channel.close()。
connection.close();
}
}



}

おすすめ

転載: www.cnblogs.com/yangxijun/p/12570828.html