環境構成
SpringBoot
Integration RabbitMQ
はメッセージの送信を実現します。
1. maven
依存関係を追加します
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2. application.yml 設定ファイルを追加します
spring: rabbitmq: host: 192.168.3.19 port: 5672 username: admin password: xxxx
3. スイッチ、キュー、バインディングを設定します
@Bean public DirectExchange myExchange() { DirectExchange directExchange = new DirectExchange("myExchange"); return directExchange; } @Bean public Queue myQueue() { Queue queue = new Queue("myQueue"); return queue; } @Bean public Binding binding() { return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey"); }
4. プロダクションはメッセージを送信します
@Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/send") public String send(String message) { rabbitTemplate.convertAndSend("myExchange","myRoutingKey",message); System.out.println("【发送消息】" + message) return "【send message】" + message; }
5. コンシューマはメッセージを受信します
@RabbitListener(queuesToDeclare = @Queue("myQueue")) public void process(String msg, Channel channel, Message message) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String time = sdf.format(date); System.out.println("【接收信息】" + msg + " 当前时间" + time);
6. プロダクション側を呼び出してメッセージを送信します hello
、コンソール出力:
#[メッセージ送信] helloメッセージが正常に受信されたことを示します。 メッセージ損失分析[メッセージ受信] hello 現在時刻 2022-05-12 10:21:14
- #プロダクション側で失われた: プロデューサーは
- RabbitMQ
- RabbitMQ
ストレージ自体はdown
#消費者側で紛失: ネットワークの問題により、ストレージを消費者側に送信できないか、消費がハングして通常の消費を送信できません - RabbitMQ
実稼働フェーズ
リクエスト確認メカニズム
を使用して、メッセージの信頼性の高い送信を保証します。 RabbitMQ サーバーにメッセージを送信した後、RabbitMQ はメッセージを受信し、RabbitMQ サーバーがメッセージを正常に受信したことを示す要求確認を送信者に返します。Configuration application.yml
spring: rabbitmq: # 消息确认机制 生产者 -> 交换机 publisher-confirms: true # 消息返回机制 交换机 -> 队列 publisher-returns: trueConfiguration
@Configuration @Slf4j public class RabbitConfig { @Autowired private ConnectionFactory connectionFactory; @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { log.info("【correlationData】:" + correlationData); log.info("【ack】" + ack); log.info("【cause】" + cause); if (ack) { log.info("【发送成功】"); } else { log.info("【发送失败】correlationData:" + correlationData + " cause:" + cause); } } }); rabbitTemplate.setMandatory(true); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { log.warn("【消息发送失败】"); log.info("【message】" + message); log.info("【replyCode】" + replyCode); } }); return rabbitTemplate; } }
Producer
からswitch へのメッセージ、confirmCallback# があります## モードを確認します。メッセージが正常に送信された後、メッセージはメソッド confirm(CorrelationData correlationData, boolean ack, String Cause) を呼び出し、ack
に基づいてメッセージが正常に送信されたかどうかを判断します。 switch
から queue
へのメッセージには
リターン モードがあります。 メッセージの送信 製品メッセージ コンソール出力は次のとおりです:
[メッセージの受信]製品メッセージ 現在時刻 2022 -05 -12 11:27:56[correlationData]:null
[ack]true
[送信成功]
生産終了シミュレーション メッセージが失われます
ここには 2 つの解決策があります:
メッセージを送信した直後にブローカーを閉じます。後者はネットワークをシャットダウンしますが、ブローカーが閉じられた後です。 、コンソールは常にエラーを報告し、メッセージを送信します。また、500 エラーも報告します。
- 存在しないスイッチを送信:
-
// myExchange 修改成 myExchangexxxxx rabbitTemplate.convertAndSend("myExchangexxxxx","myRoutingKey",message);
結果: - [correlationData]:null 【ack】false
[送信に失敗しました]
[correlationData]:CorrelationData [id=7d468b47-b422-4523-b2a2] -06b14aef073c]送信が失敗した場合は、メッセージを再試行できます
スイッチはメッセージを受信し、成功通知を返します。コンソール出力:
スイッチは正しく、キューは送信に失敗しました。存在しないというメッセージが送信されます:
[ack ]true
[cause]null[送信成功]
[返信コード]312スイッチはキューを見つけられず、障害情報を返しました:
[メッセージ]製品メッセージ
[メッセージの送信に失敗しました]
RabbitMQメッセージがキュー。まず、キューとスイッチを正しく設定し、
キューの永続性を有効にし、キューとスイッチを作成します
デフォルト設定は永続性です
に格納されるように消費監視用のキューを変更します。
キューの永続性を非永続性に変更します: @Bean
public Queue myQueue() {
Queue queue = new Queue("myQueue",false);
return queue;
}
メッセージの送信後、メッセージはキューに保存され、メッセージの RabbitMQ が再起動されます。もはや存在しない。
@Bean public Queue myQueue() { Queue queue = new Queue("myQueue",true); return queue; }再起動後も、キュー内のメッセージはまだ存在します。
コンシューマ エンド
コンシューマ エンドはデフォルトで開始されます
自動確認モードキュー メッセージがコンシューマによって受信されると、メッセージは関係なくキューから自動的に削除されます消費者側からのメッセージがあるかどうかのニュース。したがって、コンシューマーがメッセージを正常に消費できることを確認するには、自動モードを手動確認モードに変更します。
application.yml ファイルを変更します
spring: rabbitmq: # 手动消息确认 listener: simple: acknowledge-mode: manual
メッセージを消費して受信した後、手動による確認が必要です: <pre class='brush:php;toolbar:false;'>channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);</pre><pre class='brush:php;toolbar:false;'> @RabbitListener(queuesToDeclare = @Queue("myQueue"))
public void process(String msg, Channel channel, Message message) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String time = sdf.format(date);
System.out.println("【接收信息】" + msg + " 当前时间" + time);
System.out.println(message.getMessageProperties().getDeliveryTag());
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) {
e.printStackTrace();
}
}</pre>
追加しない場合:
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
2 つのメッセージを送信します
メッセージを受信した後、確認は行われず、キューに戻されます:
プロジェクトを再起動します。その後、キュー内のメッセージはコンシューマに送信されますが、ACK 確認がなければ、キューに戻され続けます。 。channel.basicAck を追加した後、プロジェクトを再起動します
basicAck メソッド
multiple の最後のパラメータは、前のキューを削除することを意味します。
multiple は
true に設定され、後続のキューはすべてクリアされます
以上がSpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版
ビジュアル Web 開発ツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール
