2017-03-24 1 views
-1

私はRabbitMQ Javaクライアントライブラリを使ってRabbitMQキューを読み書きするJavaプログラムを持っています。エラーを投げるRabbitMQクライアントプロセスをすぐにシャットダウンするのが適切ですか?

プロセスに即時シャットダウンポリシーを適用することを検討しています。つまり、ライブラリが例外をスローするとすぐに、プロセスは自己停止で反応します。

配信の信頼性の観点からは、これは何らかの問題を引き起こすでしょうか?

IOExceptionTimeoutException及び読み出し/書き込み方法によってスローInterruptedException他に、クライアントコードは(ConnectionFactory.setExceptionHandler()で設定することができる)例外ハンドラによって処理することができる例外条件の一握りがあります。

このシナリオでは、永続的な(一時的ではない)メッセージを検討し、発行されたすべてのメッセージを確認する必要があります。

+0

意見に基づいて投票を締め切る理由を理解できません。私の理解から、Javaクライアントを使用することは、このアプローチが問題を引き起こす可能性があるかどうかでかなり客観的です。 – Piovezan

答えて

1

あなたがここに挙げたものとは明確ではありませんが、少なくとも、永続的、一時的、および未知のエラーを区別することをお勧めします。最初のケースでは、何らかの人間の介入がおそらく必要であるため、監視システムをすぐに利用したいと思うでしょう。 2番目の場合は、少し遅れてからもう一度お試しください。最後に、クライアントプロセスをシャットダウンするのが最善の方法かもしれません。

クライアントをシャットダウンする前に考慮すべきいくつかのこと、しかし:

  • それは「エラー」応答のいくつかの種類を受信する必要がある未解決のインバウンド要求を持っていますか?
  • 保存しなければならない状態がありますか?
  • 状況を回復するための良い方法はありませんか(たとえば、うさぎの接続をダンプして別のものを作成するなど)。
  • ウサギの接続を開いているマシンはいくつありますか?すべてのユーザーが一度に起動しようとすると(たとえば、すべてがデータベース、ネットワークリソースなどにぶつかっている)場合はどうなりますか?

データの整合性の問題については、キューの構成方法も検討する必要があります。キュー自体に名前が付けられていて、永続的なキューがある場合は、clintを再起動すれば、少ししかメッセージが蓄積されない場合があります。そうでない場合は、接続が切断されるとキューが削除され、配信されなかったメッセージ(または再接続する前にパブリッシュされた新しいメッセージ)は失われます。

+0

入力いただきありがとうございます。私は永続的なキューを忘れてしまった。現在のところ、これらの考慮事項に関する懸念はないため、プロセスを停止することは問題ありません。 Javaクライアントが内部状態を維持できるかどうか疑問に思っていました.JVMが突然停止すると問題が発生する可能性があります。 – Piovezan

+0

入手しました。私はJavaクライアントを特に使用していないので、その部分についてはコメントできません。私が使ったDjangoやiOSのクライアントには、このような問題はありませんでした.FWIW ... –

関連する問題